我正在尝试获取属性字符串的高度(对于任何字体、任何语言、任何奇怪的 utf8 字符等)。
我在 Badoo Chatto 上发现了这个关于不同解决方案的有趣话题:https ://github.com/badoo/Chatto/issues/129
我正在使用的解决方案是他们的:
func height(width: CGFloat, attributes: [NSAttributedString.Key: Any]) -> CGFloat {
let textContainer: NSTextContainer = {
let container = NSTextContainer(size: CGSize(width: width, height: .greatestFiniteMagnitude))
container.lineFragmentPadding = 0
return container
}()
let textStorage = NSTextStorage(string: self, attributes: attributes)
let layoutManager: NSLayoutManager = {
let layoutManager = NSLayoutManager()
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
return layoutManager
}()
let rect = layoutManager.usedRect(for: textContainer)
return rect.size.round().height
}
如何修改此逻辑以便它可以考虑最大行号?
我尝试添加container.maximumNumberOfLines = 2
,但它不会改变任何东西,因为 NSTextContainer 设置为无限高。
理想情况下,我想避免使用任何 UIView 或子视图,因为此处理必须在后台线程中完成。此外,任何基于 UIKit 的解决方案似乎都不是 100% 可靠的(参见 Badoo Chatto 链接)。