Đây là nó. Điều này hoạt động với attributedText
, trước khi trở lại đơn giản text
, điều này rất có ý nghĩa đối với chúng tôi, những người xử lý nhiều họ phông chữ, kích cỡ và thậm chí là NSTextAttachments!
Hoạt động tốt với autolayout, nhưng rõ ràng là các ràng buộc phải được xác định và thiết lập trước khi chúng tôi kiểm tra isTruncated
, nếu không, bản thân nhãn thậm chí không biết cách bố trí chính nó, vì vậy không có cách nào nó thậm chí có thể biết nếu nó bị cắt bớt.
Nó không hoạt động để tiếp cận vấn đề này chỉ với một đơn giản NSString
và sizeThatFits
. Tôi không chắc làm thế nào mọi người nhận được kết quả tích cực như vậy. BTW, như đã đề cập nhiều lần, việc sử dụng sizeThatFits
không phải là lý tưởng chút nào vì nó có tính numberOfLines
đến kích thước kết quả, điều này đánh bại toàn bộ mục đích của những gì chúng ta đang cố gắng làm, bởi vì isTruncated
nó sẽ luôn trả về false
bất kể nó có bị cắt bớt hay không.
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
}
}