如何使用NSTextStorage获取具有最大行数的字符串的高度?

时间:2019-06-06 15:26:38

标签: ios swift nslayoutmanager nstextcontainer

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

0 个答案:

没有答案