iphone uitableview uilabel

iphone - Cálculo de la altura del texto de varias líneas para UILabel/UITableViewCell: resultados diferentes al calcular frente al dibujo real



(3)

Para etiquetas multilíneas, necesita establecer

cell.textLabel.numberOfLines = 0;

y entonces

[cell.textLabel sizeToFit];

Pero para una vista bonita necesita agregar algunos píxeles de relleno. ¡Y tu aplicación será increíble!

Este tema general se ha preguntado aquí varias veces: cómo procesar UITableViewCells con una cantidad variable de texto y, por lo tanto, variando la altura. La respuesta canónica es: calcula la altura en el delegado del controlador de vista de tabla en heightForRowAtIndexPath usando sizeWithFont: constrainedToSize: lineBreakMode :. Más tarde, la celda se dibuja, y se usa algo como [label sizeToFit] si es necesario, y todo funciona como magia.

Mi problema: estoy envolviendo algunas celdas porque sizeWithFont: devuelve diferentes dimensiones del dibujo real.

Un ejemplo específico:

El texto es el siguiente: "La gente olvida que @BillGates tenía una atractiva tableta de 1/4 de pulgada en 1993, de NEC. Lo que suceda esta semana NO será sobre hardware".

CGSize theSize = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(310.0f, FLT_MAX) lineBreakMode:UILineBreakModeWordWrap]; NSLog(@"calculated size for %@: %f, %f",text, theSize.width, theSize.height);

Esto devuelve: 306.000000, 84.000000. (Es decir, 4 filas con una fuente de 17 píxeles y un espacio de líneas de 4 píxeles, 21 píxeles de ventaja). Bien.

Sin embargo, más tarde cuando realmente dibuja la celda:

label = (UILabel *)[cell viewWithTag:3]; label.text = [NSString stringWithFormat:@"%@", text]; label.lineBreakMode = UILineBreakModeWordWrap; label.font = [UIFont systemFontOfSize:17.0f]; CGSize labelSize; labelSize = label.frame.size; NSLog(@"label size before resizing: %f, %f", labelSize.width, labelSize.height); [label sizeToFit]; labelSize = label.frame.size; NSLog(@"label size after resizing: %f, %f for text %@", labelSize.width, labelSize.height,text);

(UILabel se carga como parte de UITableViewCell desde NIB. En IB lo configuro a 310 px de ancho).

Esto debería devolver exactamente el mismo tamaño que el anterior. En cambio, obtengo 281.000000, 105.000000 como las dimensiones después de la llamada sizeToFit. Ahora son 5 líneas en el momento del dibujo en lugar de 4, y el texto se extiende, veo el derrame en la interfaz de usuario.

Entonces, para el mismo texto, estoy calculando dos dimensiones diferentes, y no puedo resolverlo. ¿Es algo sobre UILabel? ¿Tiene algunos márgenes internos? Esto sigue sucediendo para algunos textos, pero no para otros, y no lo he rastreado a algo particular sobre las cuerdas; parece aleatorio Este tema resalta que hay dos pases de procesamiento: calcular la altura frente al dibujo real. Esto es consistente con lo que estoy viendo. Pero no entiendo qué está pasando exactamente ni cómo solucionarlo.

La pregunta: ¿por qué veo dos tamaños calculados diferentes y cómo lo soluciono?


Por supuesto, la solución es obvia 30 segundos después de la publicación. Tal vez sea útil para otros también ...

El tamaño por sizeWithFont: era correcto. Los tamaños que [label sizeToFit] la manera anterior fueron incorrectos, ya que [label sizeToFit] reduce el ancho del marco de la etiqueta. En llamadas posteriores al mismo código, comenzó con el marco que ya se pudo haber reducido.

La solución fue simplemente restablecer el width del marco a un buen ancho conocido antes de dimensionar para que se ajuste:

CGRect labelFrame = label.frame; labelFrame.size.width = 310; label.frame = labelFrame; [label sizeToFit];


titleSize = [title sizeWithFont:[UIFont systemFontOfSize:(CGFloat)17.0] constrainedToSize:CGSizeMake(280, 2000) lineBreakMode:NSLineBreakByWordWrapping];