Это оно. Это работает attributedText
, прежде чем вернуться к простому text
, что имеет большой смысл для нас, людей, которые имеют дело с несколькими семействами шрифтов, размерами и даже NSTextAttachments!
Прекрасно работает с автопложением, но, очевидно, ограничения должны быть определены и установлены до проверки isTruncated
, иначе сама метка даже не узнает, как себя выложить, поэтому она даже не узнает, усечена ли она.
Невозможно подойти к этой проблеме с помощью простого NSString
и sizeThatFits
. Не знаю, как люди получали такие положительные результаты. Кстати, как упоминалось много раз, использование sizeThatFits
не идеально, потому что оно учитывает numberOfLines
результирующий размер, который сводит на нет всю цель того, что мы пытаемся сделать, потому isTruncated
что всегда будет возвращаться, false
независимо от того, усечено оно или нет.
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
}
}