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