Das ist es. Dies funktioniert mit attributedText, bevor textwir 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 NSStringund 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 sizeThatFitsnicht ideal, da sie numberOfLinesdie resultierende Größe berücksichtigt , die den gesamten Zweck unseres Versuchs zunichte macht, da isTruncatedsie immer zurückkehren würde, falseunabhä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
}
}