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 NSStringdan sizeThatFits. Saya tidak yakin bagaimana orang mendapatkan hasil positif seperti itu. BTW, seperti yang disebutkan berkali-kali, menggunakan sizeThatFitstidak ideal sama sekali karena memperhitungkan numberOfLinesukuran yang dihasilkan, yang mengalahkan seluruh tujuan dari apa yang kami coba lakukan, karena isTruncatedakan selalu kembali falseterlepas 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
}
}