Di iOS 7, sizeWithFont:
sekarang sudah usang. Bagaimana saya sekarang meneruskan objek UIFont ke metode penggantian sizeWithAttributes:
?
objective-c
deprecated
ios7
James Kuang
sumber
sumber
NSString
danUILabel
(tidak SELALU kasusnya, tetapi sering kali demikian), untuk mencegah duplikasi kode / dll, Anda juga dapat mengganti[UIFont systemFontOfSize:17.0f]
denganlabel.font
- membantu pemeliharaan kode dengan merujuk data yang ada vs. Anda mengetiknya beberapa kali atau merujuk konstanta di seluruh tempat, dllboundingRectWithSize:options:attributes:context:
sebagai gantinya, dengan menyerahkanCGSizeMake(250.0f, CGFLOAT_MAX)
sebagian besar kasus.Saya percaya fungsi tersebut sudah usang karena serangkaian
NSString+UIKit
fungsi (sizewithFont:...
, dll) didasarkan padaUIStringDrawing
perpustakaan, yang bukan thread aman. Jika Anda mencoba menjalankannya bukan di utas utama (sepertiUIKit
fungsi lainnya ), Anda akan mendapatkan perilaku yang tidak terduga. Khususnya, jika Anda menjalankan fungsi pada banyak utas secara bersamaan, mungkin aplikasi Anda akan macet. Inilah sebabnya mengapa di iOS 6, mereka memperkenalkanboundingRectWithSize:...
metode untukNSAttributedString
. Ini dibangun di atasNSStringDrawing
perpustakaan dan aman utasnya.Jika Anda melihat
NSString
boundingRectWithSize:...
fungsi baru , ia meminta array atribut dengan cara yang sama dengan aNSAttributeString
. Jika saya harus menebak,NSString
fungsi baru ini di iOS 7 hanyalah pembungkus untukNSAttributeString
fungsi dari iOS 6.Pada catatan itu, jika Anda hanya mendukung iOS 6 dan iOS 7, maka saya pasti akan mengubah semua Anda
NSString
sizeWithFont:...
menjadiNSAttributeString
boundingRectWithSize
. Ini akan menghemat banyak sakit kepala jika Anda memiliki kasing sudut multi-threading yang aneh! Inilah cara saya mengonversiNSString
sizeWithFont:constrainedToSize:
:Apa yang dulu:
Dapat diganti dengan:
Harap perhatikan dokumentasi yang menyebutkan:
Jadi untuk mengeluarkan tinggi atau lebar yang dihitung yang akan digunakan untuk mengukur ukuran, saya akan menggunakan:
sumber
Seperti yang Anda lihat
sizeWithFont
di situs Pengembang Apple itu sudah usang jadi kami perlu menggunakannyasizeWithAttributes
.sumber
[NSObject respondsToSelector:]
metode seperti di sini: stackoverflow.com/a/3863039/1226304Saya membuat kategori untuk menangani masalah ini, ini dia:
Dengan cara ini Anda hanya perlu mencari / mengganti
sizeWithFont:
dengansizeWithMyFont:
dan Anda siap melakukannya.sumber
Di iOS7 saya membutuhkan logika untuk mengembalikan ketinggian yang benar untuk tampilan tabel: metode heightForRowAtIndexPath, tetapi sizeWithAttributes selalu mengembalikan ketinggian yang sama terlepas dari panjang string karena tidak tahu bahwa itu akan dimasukkan ke dalam sel tabel lebar tetap . Saya menemukan ini bekerja bagus untuk saya dan menghitung ketinggian yang benar dengan mempertimbangkan lebar untuk sel tabel! Ini berdasarkan jawaban Mr. T di atas.
sumber
Label multi-garis menggunakan ketinggian dinamis mungkin memerlukan informasi tambahan untuk mengatur ukuran dengan benar. Anda dapat menggunakan sizeWithAttributes dengan UIFont dan NSParagraphStyle untuk menentukan font dan mode line-break.
Anda akan menentukan Gaya Paragraf dan menggunakan NSDictionary seperti ini:
Anda dapat menggunakan properti CGSize 'customizedSize' atau CGRect sebagai rect.size.height jika Anda mencari ketinggian.
Info lebih lanjut tentang NSParagraphStyle di sini: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html
sumber
sumber
Buat fungsi yang mengambil instance UILabel. dan mengembalikan CGSize
sumber
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
Solusi alternatif-
sumber
Membangun di @bitsand, ini adalah metode baru yang saya tambahkan ke kategori NSString + Extras saya:
Saya hanya menggunakan ukuran frame yang dihasilkan.
sumber
Anda masih bisa menggunakan
sizeWithFont
. tetapi, di iOS> = 7.0 metode menyebabkan crash jika string berisi spasi awal dan akhir atau garis akhir\n
.Memotong teks sebelum menggunakannya
Itu juga mungkin berlaku untuk
sizeWithAttributes
dan[label sizeToFit]
.juga, setiap kali Anda memiliki
nsstringdrawingtextstorage message sent to deallocated instance
perangkat iOS 7.0 itu berurusan dengan ini.sumber
Lebih baik gunakan dimensi otomatis (Swift):
NB: 1. Prototipe UITableViewCell harus dirancang dengan baik (untuk contoh jangan lupa setel UILabel.numberOfLines = 0 dll) 2. Hapus metode HeightForRowAtIndexPath
VIDEO: https://youtu.be/Sz3XfCsSb6k
sumber
sumber
Jawaban yang diterima di Xamarin adalah (gunakan sizeWithAttributes dan UITextAttributeFont):
sumber
Sebagai jawaban @Ayush:
Nah, seandainya pada 2019+ Anda mungkin menggunakan Swift dan
String
bukannya Objective-c danNSString
, inilah cara yang benar untuk mendapatkan ukuran hurufString
dengan font yang telah ditentukan:sumber
sumber
Berikut ini adalah setara monotouch jika ada yang membutuhkannya:
yang bisa digunakan seperti ini:
sumber
sumber
Coba sintaks ini:
sumber
Tak satu pun dari ini bekerja untuk saya di ios 7. Inilah yang akhirnya saya lakukan. Saya menempatkan ini di kelas sel khusus saya dan memanggil metode dalam metode heightForCellAtIndexPath saya.
Sel saya terlihat mirip dengan sel deskripsi saat melihat aplikasi di app store.
Pertama di storyboard, atur label Anda ke 'attributedText', atur jumlah baris menjadi 0 (yang akan mengubah ukuran label secara otomatis (hanya 6 + lebih)) dan atur ke bungkus kata.
Lalu saya hanya menambahkan semua ketinggian isi sel di Kelas Sel kustom saya. Dalam kasus saya, saya memiliki Label di bagian atas yang selalu bertuliskan "Keterangan" (_descriptionHeadingLabel), label yang lebih kecil yang ukuran variabel yang berisi deskripsi aktual (_descriptionLabel) kendala dari bagian atas sel ke pos (_descriptionHeadingLabelTopConstraint) . Saya juga menambahkan 3 ke spasi sedikit di bagian bawah (tentang jumlah yang sama tempat apel pada sel jenis subtitle.)
Dan dalam delegasi Table View saya:
Anda bisa mengubah pernyataan if menjadi sedikit 'lebih pintar' dan benar-benar mendapatkan pengenal sel dari semacam sumber data. Dalam kasus saya sel-sel akan dikodekan dengan keras karena akan ada jumlah yang tetap dari mereka dalam urutan tertentu.
sumber
boundingRectWithSize
di ios 9.2 masalah sekarang, hasilnya berbeda dengan ios <9.2. Anda menemukan atau mengetahui cara terbaik lain untuk membuat ini.