Das ist es. Dies funktioniert mit attributedText
, bevor text
wir auf die Ebene zurückgreifen , was für uns Leute, die sich mit mehreren Schriftfamilien, -größen und sogar NSTextAttachments befassen, sehr sinnvoll ist!
Funktioniert gut mit Autolayout, aber offensichtlich müssen die Einschränkungen definiert und festgelegt werden, bevor wir sie überprüfen isTruncated
. Andernfalls weiß das Etikett selbst nicht einmal, wie es sich selbst anordnen soll, sodass es auf keinen Fall wissen würde, ob es abgeschnitten ist.
Es funktioniert nicht, dieses Problem nur mit einem einfachen NSString
und zu lösen sizeThatFits
. Ich bin mir nicht sicher, wie die Leute so positive Ergebnisse erzielt haben. Übrigens, wie bereits mehrfach erwähnt, ist die Verwendung überhaupt sizeThatFits
nicht ideal, da sie numberOfLines
die resultierende Größe berücksichtigt , die den gesamten Zweck unseres Versuchs zunichte macht, da isTruncated
sie immer zurückkehren würde, false
unabhängig davon, ob sie abgeschnitten ist oder nicht.
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
}
}