1

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

4

0 回答 0