Это оно. Это работает 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
}
}