2010-03-31 9 views
5

Estoy cargando un texto de ayuda de un plist y mostrando el mismo en forma de UILabels alojado en un UIScrollView. Parte del código de la siguiente manera:Saltos de línea que no funcionan en UILabel

UILabel *sectionDetailLabel = [[[UILabel alloc] initWithFrame:CGRectMake(34, myOriginForThisSection, 286, 20)] autorelease]; 
    sectionDetailLabel.backgroundColor = [UIColor clearColor]; 
    sectionDetailLabel.numberOfLines = 0; 
    sectionDetailLabel.font = [UIFont systemFontOfSize:12]; 
    sectionDetailLabel.textColor = [UIColor blackColor]; 
    sectionDetailLabel.textAlignment = UITextAlignmentLeft; 
    sectionDetailLabel.lineBreakMode = UILineBreakModeWordWrap; 

    [baseScrollView addSubview:sectionDetailLabel]; 

    [sectionDetailLabel setText:myStringForThisSection]; 
    [sectionDetailLabel sizeToFit]; 

Mientras que cualquier texto 'largo' se está envuelto en varias líneas correctamente, no soy capaz de insertar manualmente los saltos de línea utilizando nueva línea '\ n' personajes 'myStringForThisSection '. Solo veo los caracteres '\' e 'n' impresos en UILabel donde quiera que sea el salto de línea.

He buscado esto y el consenso general parece ser que establecer numberOfLines en 0, establecer lineBreakMode en un valor válido e invocar sizeToFit (o establecer el marco de UILabel basado en sizeWithFont :) debería hacer. Todo lo que parece que estoy haciendo en el código anterior, y funciona perfectamente al ajustar largas cadenas de longitud desconocida en múltiples líneas en el UILabel. Entonces, ¿qué podría faltar aquí?

Nota: Todas las variables utilizadas - baseScrollView, myStringForThisSection y myOriginForThisSection - se cargaron antes de que el código anterior comenzara a ejecutarse, y funcionan bien.

+0

Si la cadena proviene de una fuente externa, esto sucederá. Si se declara/crea en el código (posiblemente incluso en un plist), la nueva línea se codificará como tal. Sin embargo, una línea nueva debe ir seguida de espacio, si esa línea es una línea en blanco. –

Respuesta

8

UILabel no interpreta la secuencia de escape \ n. Puede insertar el carácter real que representa el Retorno de carro y/o el Avance de línea. Haga un char para sostener su nueva línea y luego insértela.

unichar newLine = '\n'; 
NSString *singleCR = [NSString stringWithCharacters:&newLine length:1]; 
[myStringForThisSection insertString:singleCR atIndex:somePlaceIWantACR]; 

Siempre que su myStringForThisSection sea mutable, debería hacerlo.

+0

¡Eso funcionó! Muchas gracias. –

+0

El retorno de carro escapado, es decir, '\ r', también funciona. Al menos en Swift 3, en iOS 10+ – Chris

3

tuve problemas con la respuesta de Scot Gustafson anteriormente en XCode 4.3

Tal vez puedas probar:

unichar chr[1] = {'\n'}; 
NSString *cR = [NSString stringWithCharacters:(const unichar *)chr length:1]; 

Entonces utilizar en el código algo como esto:

self.myLabel.text = [NSString stringWithFormat:@"First Label Line%@Second Label Line", cR]; 
+0

Ha pasado mucho tiempo. Sin embargo, puedo ver los méritos de no utilizar una instrucción de tipo "insertAtIndex", que siempre podría ser peligrosa, y especialmente cuando se trata de datos en varios idiomas diferentes. Si alguien más lo encuentra particularmente útil, o encuentra que el código anterior también está desactualizado, podría "promocionar" esta respuesta o votarla. –

+0

Dev de cualquier manera funciona, ¡la forma en que lo hago tiene más sentido para mentes simples como la mía! Tuve problemas con tu definición de singleCR - Recibí un error en IOS5 xCode 4.3.1 – DoctorG

+0

Hehe sure. Revisaré ambas soluciones una vez que tenga tiempo y volveré a publicar. –

1

no pude obtener Scott & La solución de DoctorG para trabajar (aunque no pasé demasiado tiempo tratando), pero aquí está la solución simple que funciona para mí cuando estoy extrayendo texto escapado de un archivo xml

Dentro de mi clase de función de cadena, que definen:

+(NSString)escapeXml:(NSString*)string { 
    return [string stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"]; 
}