É 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 NSString
e sizeThatFits
. Não tenho certeza de como as pessoas estão obtendo resultados positivos como esse. BTW, como mencionei inúmeras vezes, usar sizeThatFits
não é o ideal de forma alguma, pois leva em consideração numberOfLines
o tamanho resultante, o que anula todo o propósito do que estamos tentando fazer, pois isTruncated
sempre retornaria false
independentemente 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
}
}