Ini dia. Ini bekerja dengan attributedText
, sebelum kembali ke polos text
, yang sangat masuk akal bagi kami orang-orang yang berurusan dengan banyak jenis font, ukuran, dan bahkan NSTextAttachments!
Berfungsi dengan baik dengan autolayout, tetapi jelas batasan harus ditentukan dan disetel sebelum kita memeriksa isTruncated
, jika tidak label itu sendiri bahkan tidak akan tahu bagaimana menata dirinya sendiri, jadi tidak mungkin ia akan tahu jika terpotong.
Tidak berhasil untuk mendekati masalah ini hanya dengan polos NSString
dan sizeThatFits
. Saya tidak yakin bagaimana orang mendapatkan hasil positif seperti itu. BTW, seperti yang disebutkan berkali-kali, menggunakan sizeThatFits
tidak ideal sama sekali karena memperhitungkan numberOfLines
ukuran yang dihasilkan, yang mengalahkan seluruh tujuan dari apa yang kami coba lakukan, karena isTruncated
akan selalu kembali false
terlepas dari apakah terpotong atau tidak.
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
}
}