在 Swift 中,boundingRect(with:options:attributes:context:)
方法的 options
参数使用的是 NSStringDrawingOptions
枚举。以下是这个枚举的所有选项及其说明:
NSStringDrawingOptions
枚举
-
usesLineFragmentOrigin
- 说明: 这个选项表示文本的计算是基于文本块的边界。即文本会考虑行的断裂并在多行文本的情况下进行适当计算。
- 适用场景: 通常在需要计算多行文本的边界时使用。
-
truncatesLastVisibleLine
- 说明: 如果文本块的高度不足以显示所有行,则最后一行会被截断,而不是超出边界。
- 适用场景: 在显示区域有限的情况下,只想显示部分文本并希望最后一行不会溢出。
-
usesFontLeading
- 说明: 在进行计算时,将考虑字体的行间距(leading)。
- 适用场景: 在需要精确布局文本时使用,尤其是当你有特定的字体间距要求时。
-
usesLineFragmentOrigin
和truncatesLastVisibleLine
的组合- 说明: 这两个选项可以组合使用,以便在计算多行文本时确保最后一行的处理方式正确。
示例代码
以下是一个使用这些选项的示例代码:
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
参数为 []
(空数组)。
默认行为的效果
-
单行文本计算:
- 效果: 如果文本只有一行,默认情况下方法会返回该行文本的尺寸,不会考虑行分割或任何截断。
-
多行文本计算:
- 效果: 默认情况下,如果文本包含多行但没有指定使用
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
,以确保计算结果准确,并考虑文本的实际显示效果。