Я хотел бы добавить свои мысли, так как у меня была точно такая же проблема.
Я использовал, 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
?