Saya mencoba menghitung ketinggian UILabel berdasarkan panjang String yang berbeda.
func calculateContentHeight() -> CGFloat{
var maxLabelSize: CGSize = CGSizeMake(frame.size.width - 48, CGFloat(9999))
var contentNSString = contentText as NSString
var expectedLabelSize = contentNSString.boundingRectWithSize(maxLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(16.0)], context: nil)
print("\(expectedLabelSize)")
return expectedLabelSize.size.height
}
Di atas adalah fungsi saat ini yang saya gunakan untuk menentukan ketinggian tetapi tidak berfungsi. Saya akan sangat menghargai bantuan yang bisa saya dapatkan. Saya akan mengalihkan jawaban dalam Swift dan bukan Objective C.
Jawaban:
Gunakan ekstensi pada
String
Cepat 3
dan juga pada
NSAttributedString
(yang sangat berguna di kali)Cepat 4
Ubah saja nilai
attributes
dalamextension String
metodedari
untuk
sumber
[NSFontAttributeName: font, NSLineBreakMode: .ByWordWrapping]
tetapi tidak berhasilNSParagraphStyleAttributeName : style
mana gaya adalah NSMutableParagraphStylesizeForItemAtIndexPath
dalamUICollectionView
adalah bahwa tampaknya untuk menimpa kembali untukinsetForSectionAt
Untuk teks multiline, jawaban ini tidak berfungsi dengan benar. Anda dapat membangun ekstensi String yang berbeda dengan menggunakan UILabel
UILabel mendapatkan lebar tetap dan .numberOfLines diatur ke 0. Dengan menambahkan teks dan memanggil .sizeToFit () secara otomatis menyesuaikan dengan ketinggian yang benar.
Kode ditulis dalam Swift 3 🔶🐦
sumber
sizeToFit
Inilah solusi sederhana yang bekerja untuk saya ... mirip dengan yang lain diposting, tetapi tidak termasuk kebutuhan untuk menelepon
sizeToFit
Perhatikan ini ditulis dalam Swift 5
Ini menangani pembungkus garis dan semacamnya. Bukan kode yang paling elegan, tetapi menyelesaikan pekerjaan.
sumber
sumber
Ini jawaban saya di Swift 4.1 dan Xcode 9.4.1
Sekarang Anda memanggil fungsi ini
sumber
Saya menemukan bahwa jawaban yang diterima bekerja untuk lebar tetap, tetapi tidak tinggi tetap. Untuk ketinggian tetap, itu hanya akan menambah lebar agar sesuai dengan semua pada satu baris, kecuali jika ada garis putus di teks.
Fungsi lebar memanggil fungsi ketinggian beberapa kali, tetapi ini adalah perhitungan cepat dan saya tidak melihat masalah kinerja menggunakan fungsi di baris UITable.
sumber
minimumTextWrapWidth:CGFloat
?Periksa ketinggian teks label dan sedang bekerja di sana
sumber
Solusi ini akan membantu menghitung tinggi dan lebar saat runtime.
Di sini Anda dapat menghitung perkiraan ketinggian yang akan diambil string Anda dan meneruskannya ke bingkai UILabel.
sumber
Swift 5:
Jika Anda memiliki UILabel dan entah bagaimana boundingRect tidak berfungsi untuk Anda (saya menghadapi masalah ini. Selalu mengembalikan ketinggian 1 baris.) Ada ekstensi untuk dengan mudah menghitung ukuran label.
Anda bisa menggunakannya seperti ini:
Bekerja untukku
sumber
sumber