To jest to. Działa to z attributedText, zanim powrócimy do prostego text, co ma sens dla nas, ludzi, którzy mają do czynienia z wieloma rodzinami czcionek, rozmiarami, a nawet NSTextAttachments!
Działa dobrze z autoukładem, ale oczywiście ograniczenia muszą zostać zdefiniowane i ustawione przed sprawdzeniem isTruncated, w przeciwnym razie sama etykieta nie będzie nawet wiedziała, jak się układać, więc nie ma możliwości, aby nawet wiedziała, czy jest obcięta.
Nie działa podejście do tego problemu za pomocą zwykłego NSStringi sizeThatFits. Nie jestem pewien, jak ludzie osiągali takie pozytywne wyniki. BTW, jak już wielokrotnie wspominano, użycie sizeThatFitsnie jest wcale idealne, ponieważ bierze pod uwagę numberOfLineswynikowy rozmiar, co niweczy cały cel tego, co próbujemy zrobić, ponieważ isTruncatedzawsze wróciłoby falseniezależnie od tego, czy jest obcięty, czy nie.
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
}
}