Me gustaría agregar mis pensamientos ya que tenía exactamente el mismo problema.
Estaba usando UITextView
porque tenía una mejor alineación de texto (justificar, que en ese momento no estaba disponible UILabel
), pero para "simular" no interactivo-no desplazable UILabel
, desactivaba el desplazamiento completo, el rebote y la interacción del usuario .
Por supuesto, el problema era que el texto era dinámico, y aunque el ancho sería fijo, la altura debería recalcularse cada vez que estableciera un nuevo valor de texto.
boundingRectWithSize
no me funcionó bien, por lo que pude ver, UITextView
fue agregar un margen en la parte superior que boundingRectWithSize
no entraría en un conteo, por lo tanto, la altura recuperada boundingRectWithSize
fue menor de lo que debería ser.
Como el texto no debía actualizarse rápidamente, solo se usa para obtener información que puede actualizarse cada 2-3 segundos como máximo, he decidido seguir el siguiente enfoque:
/* 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 );
}
* El código anterior no se copia directamente de mi fuente, tuve que ajustarlo / borrarlo de un montón de otras cosas que no son necesarias para este artículo. No lo tome por copiar-pegar-y-va a funcionar-código.
La desventaja obvia es que tiene asignación y liberación, para cada llamada.
Pero, la ventaja es que evita depender de la compatibilidad entre la forma en que boundingRectWithSize dibuja el texto y calcula su tamaño y la implementación del dibujo de texto UITextView
(o UILabel
que también puede usar simplemente reemplazar UITextView
con UILabel
). De esta manera, se evitan los "errores" que Apple pueda tener.
PD: Parece que no deberías necesitar esta "temperatura" UITextView
y puedes pedir sizeThatFits
directamente desde el objetivo, sin embargo, eso no funcionó para mí. Aunque la lógica diría que debería funcionar y la asignación / liberación de temporal UITextView
no es necesaria, no lo hizo. Pero esta solución funcionó a la perfección para cualquier texto que agregue.
lineBreakMode
?