Я хотел бы добавить свои мысли, так как у меня была точно такая же проблема.
Я использовал, UITextViewтак как у него было более хорошее выравнивание текста (выровнять, чего в то время не было в наличии UILabel), но для того, чтобы «симулировать» неинтерактивную и не прокручиваемую UILabel, я бы полностью отключил прокрутку, отскок и взаимодействие с пользователем ,
Конечно, проблема заключалась в том, что текст был динамическим, и хотя ширина будет фиксированной, высоту следует пересчитывать каждый раз, когда я устанавливаю новое текстовое значение.
boundingRectWithSizeу меня ничего не получалось, насколько я вижу, UITextViewдобавление некоторого поля сверху, которое boundingRectWithSizeне попадало в счетчик, следовательно, полученная высота boundingRectWithSizeбыла меньше, чем должна быть.
Поскольку текст не должен был быстро обновляться, он просто используется для некоторой информации, которая может обновляться чаще всего каждые 2-3 секунды, поэтому я решил использовать следующий подход:
/* 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 );
}
* Выше код не скопирован напрямую из моего источника, я должен был настроить его / очистить его от других вещей, которые не нужны для этой статьи. Не принимайте это за код "вставь и вставь".
Очевидным недостатком является то, что он имеет выделение и освобождение для каждого вызова.
Но, преимущество заключается в том, что вы избежите в зависимости от совместимости между тем, как boundingRectWithSize рисует текст и вычислил его размер и реализация текста чертежа в UITextView(или UILabelкоторые также можно использовать просто заменить UITextViewс UILabel). Таким образом можно избежать любых «ошибок», которые может иметь Apple.
PS Может показаться, что вам не нужен этот «темп», UITextViewи вы можете просто спросить sizeThatFitsнепосредственно у цели, однако это не сработало для меня. Хотя логика сказала бы, что она должна работать, а выделение / выпуск временных UITextViewне нужны, это не так. Но это решение работало безупречно для любого текста, который я бы включил.
lineBreakMode?