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 NSString
i sizeThatFits
. Nie jestem pewien, jak ludzie osiągali takie pozytywne wyniki. BTW, jak już wielokrotnie wspominano, użycie sizeThatFits
nie jest wcale idealne, ponieważ bierze pod uwagę numberOfLines
wynikowy rozmiar, co niweczy cały cel tego, co próbujemy zrobić, ponieważ isTruncated
zawsze wróciłoby false
niezależ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
}
}