Как получить высоту строки с максимальным количеством строк, используя NSTextStorage? - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь получить высоту приписанной строки (для любого шрифта, любого языка, любых странных символов 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).

...