Aynı sorunu yaşadığım için düşüncelerimi eklemek istiyorum.
Kullanıyordum UITextView daha hoş metin hizalama (o zaman mevcut değildi haklı) vardı beriUILabel , ama etkileşimli-kaydırılamaz "simüle" amacıyla UILabel, tamamen kaydırma, sıçrayan ve kullanıcı etkileşimi kapatmak istiyorum .
Tabii ki, sorun metnin dinamik olmasıydı ve genişlik sabitlenirken, her yeni metin değeri ayarladığımda yükseklik yeniden hesaplanmalıdır.
boundingRectWithSizebenim için hiç iyi çalışmadı, görebildiğim kadarıyla UITextViewüstüne biraz marj ekliyordu.boundingRectWithSize bir sayıya girmeyecek bir , dolayısıyla, alınan yükseklik boundingRectWithSizeolması gerekenden daha küçüktü.
Metin hızlı bir şekilde güncellenmeyeceğinden, en çok 2-3 saniyede bir güncellenebilecek bazı bilgiler için kullanılır, aşağıdaki yaklaşıma karar verdim:
/* 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 );
}
* Yukarıdaki kod doğrudan kaynağımdan kopyalanmadı, ayarlamak için / bu makale için gerekli olmayan diğer şeylerden temizlemek zorunda kaldı. Kopyala-yapıştır-ve-işe yarayacak-kod için almayın.
Açık olan dezavantajı, her çağrı için ayırma ve serbest bırakma olmasıdır.
Ama avantajı boundingRectWithSize metin ve hesaplamanın çizer nasıl arasındaki uyumluluk bağlı kaçındıklarını olduğunu o boyutu ve metin çizim uygulaması UITextView(ya UILabelda sadece değiştirmek kullanabilirsiniz UITextViewile UILabel). Apple'ın sahip olabileceği herhangi bir "hata" bu şekilde önlenir.
PS Görünüşe göre bu "temp" gerekmez UITextViewve sadece sizeThatFitsdoğrudan hedefe sorabilirsiniz , ancak bu benim için işe yaramadı. Mantık, çalışması gerektiğini söylese ve geçici UITextViewolarak tahsis / serbest bırakmaya gerek yoktur, ancak gerekmedi. Ancak bu çözüm, girebileceğim herhangi bir metin için kusursuz çalıştı.
lineBreakModemı?