É isso. Isso funciona attributedText, antes de voltar ao normal text, o que faz muito sentido para nós, pessoas que lidamos com várias famílias de fontes, tamanhos e até mesmo NSTextAttachments!
Funciona bem com autolayout, mas obviamente as restrições devem ser definidas e configuradas antes de verificarmos isTruncated, caso contrário, o rótulo em si nem mesmo saberá como se dispor, então de forma alguma saberia se está truncado.
Não funciona abordar esse problema com apenas um NSStringe sizeThatFits. Não tenho certeza de como as pessoas estão obtendo resultados positivos como esse. BTW, como mencionei inúmeras vezes, usar sizeThatFitsnão é o ideal de forma alguma, pois leva em consideração numberOfLineso tamanho resultante, o que anula todo o propósito do que estamos tentando fazer, pois isTruncatedsempre retornaria falseindependentemente de estar truncado ou não.
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
}
}