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.
boundingRectWithSize
benim 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 boundingRectWithSize
olması 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 UILabel
da sadece değiştirmek kullanabilirsiniz UITextView
ile UILabel
). Apple'ın sahip olabileceği herhangi bir "hata" bu şekilde önlenir.
PS Görünüşe göre bu "temp" gerekmez UITextView
ve sadece sizeThatFits
doğrudan hedefe sorabilirsiniz , ancak bu benim için işe yaramadı. Mantık, çalışması gerektiğini söylese ve geçici UITextView
olarak tahsis / serbest bırakmaya gerek yoktur, ancak gerekmedi. Ancak bu çözüm, girebileceğim herhangi bir metin için kusursuz çalıştı.
lineBreakMode
mı?