Це воно. Це спрацьовує 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
}
}