2011-02-05 25 views
13

¿Existe un método equivalente al sizeWithFont: de NSString que se puede usar para calcular la altura del texto en una UITectView para un ancho determinado? Todos los métodos de NSString solo operan en una sola línea de lo que puedo decir.NSString sizeWithFont: para líneas múltiples?

Respuesta

33

De Apple's reference para estos métodos de NSString, puede usar -sizeWithFont:constrainedToSize: o -sizeWithFont:constrainedToSize:lineBreakMode: para "Métrica de cálculo para múltiples líneas de texto".

CGSize size = [theString sizeWithFont:font 
        constrainedToSize:CGSizeMake(width, 100000)]; 
return size.height; 
+0

Eso es exactamente lo que he usado para determinar la altura de varias líneas. Básicamente, simplemente establece la altura posible en un valor realmente grande, y recupera el tamaño real que se ajusta al texto envuelto en varias líneas. –

+13

Esto parece devolver un valor de 1-2 líneas demasiado pequeño. ¿Alguna idea de por qué? – Jumhyn

+0

@Jumhyn: pruebe con el método '-drawInRect:' para dibujar la cadena para verificar si se ajusta en el lugar correcto. – kennytm

4

Para UITextView, todo lo que tiene que hacer es llamar -sizeToFit en la vista, y se cambiará automáticamente el tamaño de su altura hasta que pueda caber todo el texto disponible. Todo lo que necesita hacer es establecer el ancho de la vista de texto, configurar el texto, luego llamar al -sizeToFit. La vista de texto cambiará el tamaño de su altura lo suficiente como para ajustarse a todo el texto.

ACTUALIZACIÓN:

de texto Al parecer vistas solamente se contraen cuando hay exceso de altura, pero que no crecen si hay suficiente altura para mostrar todo el texto. Además, una vez que llame al -sizeToFit, la coordenada y de la vista de texto se reinicia a 0.0f. Así que esto es lo que hace:

CGFloat textViewWidth = 300.0f; 
CGFloat textViewPadding = 10.0f; 

UITextView * textView = [[[UITextView alloc] init] autorelease]; 
textView.text = ...; // Really long string 
textView.frame = CGRectMake(0.0f, 0.0f, textViewWidth, CGFLOAT_MAX); 

[textView sizeToFit]; // Shrinks the height to fit all the text 

textView.frame = CGRectMake(textViewPadding, textViewPadding, 
    textViewWidth, textView.frame.size.height); 

[self.view addSubview:textView]; 

Primero, establece el marco para que pueda establecer el ancho como desee. Utiliza CGFLOAT_MAX para indicar bastante altura infinita. A continuación, al llamar al -sizeToFit se reduce la altura hasta que se ajuste a todo el texto. Sin embargo, también se restablece el y de coordenadas, por lo que seguir adelante y establecer el marco de nuevo para configurar los x y y coordenadas-en este ejemplo, 10.0f tanto para x y y -, dejando el ancho solo y manteniendo la altura establecida a lo -sizeToFit calculado.

+0

Parece que no cambia nada. – Jumhyn

+0

Aclaré cómo 'UITextView' realmente funciona. Hacer algo como el código de muestra que agregué debería resultar en una vista de texto que sea lo suficientemente alta como para caber todo el texto. – LucasTizma

+0

CGFLOAT_MAX causó algunos funky manchas/rasgaduras en iPhone 5.1 cuando el UITextView renunció a la primera respuesta y el UITableView se desplazó de nuevo a la parte superior. Un número más pequeño como 1024.0f (lado largo del iPad) lo arregló para mí. –

1

En realidad, podría utilizar la propiedad contentSize.

Cuestiones relacionadas