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