首页 > 其他分享 >NSStringDrawingOptions

NSStringDrawingOptions

时间:2024-09-28 20:13:25浏览次数:6  
标签:usesLineFragmentOrigin boundingRect NSStringDrawingOptions let attributes 文本 opt

在 Swift 中,boundingRect(with:options:attributes:context:) 方法的 options 参数使用的是 NSStringDrawingOptions 枚举。以下是这个枚举的所有选项及其说明:

NSStringDrawingOptions 枚举

  1. usesLineFragmentOrigin

    • 说明: 这个选项表示文本的计算是基于文本块的边界。即文本会考虑行的断裂并在多行文本的情况下进行适当计算。
    • 适用场景: 通常在需要计算多行文本的边界时使用。
  2. truncatesLastVisibleLine

    • 说明: 如果文本块的高度不足以显示所有行,则最后一行会被截断,而不是超出边界。
    • 适用场景: 在显示区域有限的情况下,只想显示部分文本并希望最后一行不会溢出。
  3. usesFontLeading

    • 说明: 在进行计算时,将考虑字体的行间距(leading)。
    • 适用场景: 在需要精确布局文本时使用,尤其是当你有特定的字体间距要求时。
  4. usesLineFragmentOrigintruncatesLastVisibleLine的组合

    • 说明: 这两个选项可以组合使用,以便在计算多行文本时确保最后一行的处理方式正确。

示例代码

以下是一个使用这些选项的示例代码:

import UIKit

let text = "Hello, World!\nThis is a test string."
let font = UIFont.systemFont(ofSize: 17)
let attributes: [NSAttributedString.Key: Any] = [.font: font]

let size = CGSize(width: 200, height: .greatestFiniteMagnitude)

let boundingRect = text.boundingRect(
    with: size,
    options: [.usesLineFragmentOrigin, .truncatesLastVisibleLine],
    attributes: attributes,
    context: nil
)

print("Bounding rect: \(boundingRect)")

适用场景总结

  • 使用 usesLineFragmentOrigin 是进行文本边界测量时的最常用选项,尤其在处理多行文本时。
  • truncatesLastVisibleLine 适合当文本的显示区域有限,希望控制文本截断方式时。
  • usesFontLeading 在处理需要行间距控制的特殊文本布局时使用。

在 Swift 中,调用 boundingRect(with:options:attributes:context:) 方法时,如果不明确指定 options 参数,它的默认行为是不使用任何选项。也就是说,默认情况下,options 参数为 [](空数组)。

默认行为的效果

  1. 单行文本计算:

    • 效果: 如果文本只有一行,默认情况下方法会返回该行文本的尺寸,不会考虑行分割或任何截断。
  2. 多行文本计算:

    • 效果: 默认情况下,如果文本包含多行但没有指定使用 usesLineFragmentOrigin,方法将只计算第一行的大小。其他行将不会被考虑,因此可能导致计算结果不准确。

示例代码

下面是一个示例,展示了默认情况下的行为与指定选项的行为之间的区别:

import UIKit

let text = "Hello, World!\nThis is a test string."
let font = UIFont.systemFont(ofSize: 17)
let attributes: [NSAttributedString.Key: Any] = [.font: font]

let singleLineSize = text.boundingRect(
    with: CGSize(width: 200, height: .greatestFiniteMagnitude),
    options: [],  // 默认选项
    attributes: attributes,
    context: nil
)

let multiLineSize = text.boundingRect(
    with: CGSize(width: 200, height: .greatestFiniteMagnitude),
    options: [.usesLineFragmentOrigin],  // 使用行片段原点
    attributes: attributes,
    context: nil
)

print("Default size (single line): \(singleLineSize)")
print("Size with usesLineFragmentOrigin: \(multiLineSize)")

结果分析

  • Default size (single line): 这将仅返回 "Hello, World!" 的宽高,而不会考虑 "\n" 后的内容。
  • Size with usesLineFragmentOrigin: 这将返回完整文本的尺寸,正确计算了包括换行符在内的所有内容。

总结

  • 如果你只关心单行文本的尺寸,使用默认选项是可以的。
  • 对于多行文本,强烈建议使用 usesLineFragmentOrigin,以确保计算结果准确,并考虑文本的实际显示效果。

标签:usesLineFragmentOrigin,boundingRect,NSStringDrawingOptions,let,attributes,文本,opt
From: https://www.cnblogs.com/Tamako-/p/18438337

相关文章