我正在尝试获取属性字符串的高度(对于任何字体,任何语言,任何奇怪的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链接)。