Це воно. Це спрацьовує attributedText
, перш ніж повернутися до рівняtext
, що має багато сенсу для нас, людей, які мають справу з кількома сімействами шрифтів, розмірами та навіть NSTextAttachments!
Добре працює з авторозміткою, але очевидно, що обмеження повинні бути визначені та встановлені перед тим, як перевірити isTruncated
, інакше сама ярлик навіть не знає, як викласти себе, так що жоден спосіб навіть не знає, чи буде її усічена.
Вона не працює , щоб підійти до цієї проблеми тільки з рівнинним NSString
і sizeThatFits
. Я не впевнений, як люди отримували подібні позитивні результати. BTW, як згадувалося багато разів, використання sizeThatFits
взагалі не є ідеальним, оскільки воно враховує numberOfLines
отриманий розмір, який перемагає всю мету того, що ми намагаємось зробити, тому isTruncated
що завжди буде повертатися false
незалежно від того, врізаний він чи ні.
extension UILabel {
var isTruncated: Bool {
layoutIfNeeded()
let rectBounds = CGSize(width: bounds.width, height: .greatestFiniteMagnitude)
var fullTextHeight: CGFloat?
if attributedText != nil {
fullTextHeight = attributedText?.boundingRect(with: rectBounds, options: .usesLineFragmentOrigin, context: nil).size.height
} else {
fullTextHeight = text?.boundingRect(with: rectBounds, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil).size.height
}
return (fullTextHeight ?? 0) > bounds.size.height
}
}