2011-12-02 9 views
9

Tengo un UILabel con el lineBreakMode configurado en UILineBreakModeWordWrap. Esto funciona bien, excepto cuando tengo una larga losa de texto sin espacios. En este caso, no envuelve la losa larga de texto, sino que simplemente la corta una vez que llega al extremo derecho del marco UILabel. ¿Cómo puedo decirle a UILabel que debe envolver un límite de caracteres en esta situación? solo (esencialmente equivalente a la configuración UILineBreakModeCharacterWrap, pero solo para las losas largas de texto sin espacio).UILabel Envoltura de palabras/Abrigo de caracteres

¡Gracias de antemano!

+1

Nota para futuros lectores (como yo): probando con iOS 7 y SDK 8, UILineBreakModeWordWrap parece funcionar de la manera en que uno esperaría ahora.Es decir, se rompe por palabra cuando es posible, pero por carácter si es necesario. Esto si para un UILabel. – eselk

Respuesta

0

Tienes que hacerlo por sí solo, no hay opción para 'utilización ajuste de texto, excepto cuando no te quiero' :)

Si una palabra demasiado larga podría insertar espacios en él antes lo muestra para ayudar a la etiqueta a saber dónde envolverlo?

3

Una forma de hacerlo es establecer la propiedad Líneas en IB.

enter image description here

o de código de hacer esto -

textLabel.lineBreakMode = UILineBreakModeWordWrap; 
textLabel.numberOfLines = 3; 

Así que cuando se establece el número de líneas como 3 el texto se ajusta hasta que muchas líneas están ocupadas.

+1

El OP específicamente quiere 'word wrap' que no se ajustará si tiene una sola palabra (por ejemplo 'Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch' que es más ancho que el cuadro de texto), no importa cuántas líneas le des :) – deanWombourne

0

dean tiene razón. Si lo desea, debe hacerlo manualmente. El siguiente código codificará una etiqueta aunque no contenga espacios. Esto puede ayudar a

  NSString *someText = yourLabel.text; 

    //Check if the text contains spaces  
//The method in the below if condition is user defined and you have to define one. lol 
     if(![self textContainsSpaces:someText]) 
     { 
     //Do the word wrap manually 
      CGSize constraintSize; 

      constraintSize.width = 165; 

      constraintSize.height = 165; 

      CGSize stringSize =[someText sizeWithFont: [UIFont boldSystemFontOfSize: 17] constrainedToSize: constraintSize lineBreakMode: UILineBreakModeWordWrap]; 

      CGRect rect = CGRectMake(yourLabel.frame.origin.x, yourLabel.frame.origin.y, 165, (stringSize.height+10)); 

      yourLabel.frame = rect; 
     } 
9

Para cualquier otra persona tienen el mismo tema, que terminó en marcha su solución mediante el uso de un UITextView en lugar de un UILabel. Esta era la mejor solución por dos razones:

  1. que no requiere ningún comportamiento personalizado para determinar si el texto contiene espacios y cambiar el modo de salto de línea de la UILabel a/desde el ajuste de línea/personaje.

  2. Lo que es más importante, hay un borde donde puede tener palabras normales (que desea envolver en los límites de las palabras) más texto extralargo (que debe ajustar los límites del carácter). A menos que escriba algún tipo de lógica para insertar un espacio en ese texto extra largo (en la posición correcta) para forzar un "ajuste de palabras falsas", no veo ninguna manera de manejar el ajuste de palabras y caracteres, dependiendo de la situación, dentro de uno UILabel. El UITextView maneja esta situación automáticamente, rompiendo límites de palabras o límites de caracteres según sea necesario.

Para detalles sobre cómo lo estoy haciendo esto, no tengo una sola línea UITextView con la edición y el desplazamiento deshabilitado. También configuré el .contentInset para quitar el relleno haciendo que se vea (para el ojo desprevenido) como un UILabel. A continuación, utilizo el método sizeWithFont:constrainedToSize:lineBreakMode: para determinar el marco del texto renderizado y ajustar el marco del UITextView en consecuencia para que se ajuste exactamente al texto.

Espero que esto ayude!