Saya ingin menambahkan pemikiran saya karena saya memiliki masalah yang sama persis.
Saya menggunakan UITextView
karena memiliki perataan teks yang lebih bagus (membenarkan, yang pada saat itu tidak tersedia UILabel
), tetapi untuk "mensimulasikan" non-interaktif-non-digulir UILabel
, saya akan mematikan sepenuhnya menggulir, memantul, dan interaksi pengguna .
Tentu saja, masalahnya adalah teks itu dinamis, dan sementara lebar akan diperbaiki, tinggi harus dihitung ulang setiap kali saya menetapkan nilai teks baru.
boundingRectWithSize
Sama sekali tidak bekerja dengan baik bagi saya, dari apa yang bisa saya lihat, UITextView
menambahkan beberapa margin di atas yang boundingRectWithSize
tidak akan masuk hitungan, oleh karena itu, ketinggian yang diperoleh boundingRectWithSize
lebih kecil dari yang seharusnya.
Karena teks tidak diperbarui dengan cepat, itu hanya digunakan untuk beberapa informasi yang paling sering diperbarui setiap 2-3 detik, saya telah memutuskan pendekatan berikut:
/* This f is nested in a custom UIView-inherited class that is built using xib file */
-(void) setTextAndAutoSize:(NSString*)text inTextView:(UITextView*)tv
{
CGFloat msgWidth = tv.frame.size.width; // get target's width
// Make "test" UITextView to calculate correct size
UITextView *temp = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, msgWidth, 300)]; // we set some height, really doesn't matter, just put some value like this one.
// Set all font and text related parameters to be exact as the ones in targeted text view
[temp setFont:tv.font];
[temp setTextAlignment:tv.textAlignment];
[temp setTextColor:tv.textColor];
[temp setText:text];
// Ask for size that fits :P
CGSize tv_size = [temp sizeThatFits:CGSizeMake(msgWidth, 300)];
// kill this "test" UITextView, it's purpose is over
[temp release];
temp = nil;
// apply calculated size. if calcualted width differs, I choose to ignore it anyway and use only height because I want to have width absolutely fixed to designed value
tv.frame = CGRectMake(tv.frame.origin.x, tv.frame.origin.y, msgWidth, tv_size.height );
}
* Kode di atas tidak langsung disalin dari sumber saya, saya harus menyesuaikan / menghapusnya dari banyak hal lain yang tidak diperlukan untuk artikel ini. Jangan bawa untuk copy-paste-dan-itu-akan-bekerja-kode.
Kerugian yang jelas adalah bahwa ia telah mengalokasikan dan melepaskan, untuk setiap panggilan.
Tetapi, keuntungannya adalah Anda menghindari tergantung pada kompatibilitas antara bagaimana boundingRectWithSize menggambar teks dan menghitung ukuran serta implementasi menggambar teks di dalamnya UITextView
(atau UILabel
yang juga dapat Anda gunakan hanya ganti UITextView
dengan UILabel
). "Bug" apa pun yang dimiliki Apple dapat dihindari.
PS Tampaknya Anda tidak perlu "temp" ini UITextView
dan bisa sizeThatFits
langsung bertanya dari target, tetapi itu tidak berhasil untuk saya. Meskipun logika akan mengatakan itu harus bekerja dan mengalokasikan / melepaskan sementara UITextView
tidak diperlukan, itu tidak. Tetapi solusi ini bekerja dengan sempurna untuk teks apa pun yang akan saya atur.
lineBreakMode
?