¿Cómo agregar un salto de línea para UILabel?

262

Veamos que tengo una cadena que se ve así:

NSString *longStr = @"AAAAA\nBBBBB\nCCCCC";  

¿Cómo hago para que UILabel muestre el mensaje así?

AAAAA
BBBBB
CCCCC

No creo que \nsea ​​reconocido por UILabel, entonces, ¿hay algo que pueda poner dentro de NSString para que UILabel sepa que tiene que crear un salto de línea allí?

Thang Pham
fuente

Respuestas:

332

Úselo \ncomo lo está utilizando en su cadena.

Establezca numberOfLines en 0 para permitir cualquier número de líneas.

label.numberOfLines = 0;

Actualice el marco de la etiqueta para que coincida con el tamaño del texto usando sizeWithFont:. Si no hace esto, su texto se centrará verticalmente o se cortará.

UILabel *label; // set frame to largest size you want
...
CGSize labelSize = [label.text sizeWithFont:label.font
                          constrainedToSize:label.frame.size
                              lineBreakMode:label.lineBreakMode];
label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

Actualización: reemplazo por obsoleto

sizeWithFont:constrainedToSize:lineBreakMode:

Referencia, Reemplazo por tamaño obsoleto ConFont: en iOS 7?

CGSize labelSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];

label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);
Gerry Shaw
fuente
2
UILabelno tiene una propiedad originni sizeen iOS? Probablemente debería ser label.frame.origin.xetc.
Peterdk
1
En lugar de usar sizeWithAttributes y luego configurar el marco, solo puede llamar a sizeToFit para que funcione y establecer el tamaño del marco en un solo paso rápido.
jimmyjudas
@Hermang, gracias por editar la respuesta para actualizarla.
Gerry Shaw
275

ingrese la descripción de la imagen aquí

Utilice la opción de retorno al escribir en el cuadro pequeño en Interface Builder para insertar un avance de línea (\ n). En los atributos de Etiqueta del Creador de interfaces, establezca # Líneas = 0.

Seleccione la etiqueta y luego cambie la propiedad Líneas a 0 como en la imagen de arriba, y luego use \ n en su cadena para el salto de línea.

Marco
fuente
2
¡Esto es súper útil!
Nitin Alabur
Busqué esto para siempre. Gracias :)
Shai Mishali
Fantástica respuesta. ¡Gracias!
TotoroTotoro 01 de
1
No funciona cuando se configura la etiqueta mediante programación y se agrega \ n (nueva línea) a la cadena.
Chewie The Chorkie
asombroso. Mi requisito era hacer esto solo con la etiqueta del guión gráfico. Y esto funcionó a las mil maravillas.
Tejas
132

Si lee una cadena de un archivo XML, el salto de línea \nen esta cadena no funcionará en el UILabeltexto. El \nno se analiza en un salto de línea.

Aquí hay un pequeño truco para resolver este problema:

// correct next line \n in string from XML file
NSString *myNewLineStr = @"\n";
myLabelText = [myLabelText stringByReplacingOccurrencesOfString:@"\\n" withString:myNewLineStr];

myLabel.text = myLabelText;

Por lo tanto, debe reemplazar la \nparte no analizada en su cadena por una analizada \nen un código rígido NSString.

Aquí están mis otras configuraciones de etiqueta:

myLabel.numberOfLines = 0;
myLabel.backgroundColor = [UIColor lightGrayColor];
myLabel.textColor = [UIColor redColor]; 
myLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];   
myLabel.textAlignment = UITextAlignmentCenter;

Lo más importante es establecerlo numberOfLinesen 0(= número ilimitado de líneas en la etiqueta).

¿No tienes idea de por qué Apple ha elegido no analizar \ncadenas leídas de XML?

Espero que esto ayude.

Al-Noor Ladhani
fuente
1
iOS no se analiza \ncuando se obtienen cadenas de Parse.com (supongo que también sucederá cuando se obtienen cadenas de otras API)
Brian
Salvaste mi día. Estoy obteniendo cadena con nueva línea de archivos xml.
Senry
127

En el generador de interfaces, puede usar Ctrl+ Enterpara insertar /nen la posición que desee. De esta forma se podría implementar la siguiente situación

aaa
aaaaaaa

kuokuo321
fuente
No, no rechacé el voto. Acabo de editar la respuesta para una mejor presentación.
m4n0
¡Tan simple! +1
marlonpya 01 de
2
¡No puedo creer que nunca supiera ese truco! Intenté shift-Enter porque es bastante estándar en otros lugares. ¡Gracias por eso!
Echelon
¡Esto era exactamente lo que estaba buscando! gracias +1!
rickrvo
1
¡Buena publicación! Pequeña corrección: creo que te refieres a insertar \ n en lugar de insertar / n
craft
25

Tienes que establecer la numberOfLinespropiedad en el UILabel. El valor predeterminado es 1 ; si lo configura en 0 , eliminará todos los límites.

Dan
fuente
22

Es importante tener en cuenta que es \n(barra invertida) en lugar de /n.

AndyOng
fuente
10

En Swift 2.2,> iOS 8

Establecí Líneas = 0 en Storyboard, en Inspector de atributos y vinculé una salida de referencia a la etiqueta. Luego, use en el controlador de esta manera:

 @IBOutlet weak var listLabel: UILabel!

 override func viewDidLoad() {
      ...
      listLabel.text = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8"
 }
CodeOverRide
fuente
7

Solo hazlo así

NSString * strCheck = @"A\nB";

strCheck = [strCheck stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];  //This is to prevent for fetching string from plist or data structure

label.numberOfLines = 0;

label.lineBreakMode = NSLineBreakByWordWrapping;

label.text = strCheck;
Sandip Patel - SM
fuente
Está funcionando .. :)
Bibin Joseph
6

// NO olvides poner numberOfLines a cero

UILabel* locationTitle = [[UILabel alloc] initWithFrame:CGRectMake(5, 30, 230, 40)];
locationTitle.font = [UIFont systemFontOfSize:13.0];
locationTitle.numberOfLines = 0;
locationTitle.text = [NSString stringWithFormat:@"Eaton industries pvt. Ltd \nUK Apr 12"];
[cell addSubview:locationTitle];
Pankaj Chauhan
fuente
4

En Xcode 6, puede usar \ n incluso dentro de una cadena cuando usa el ajuste de línea. Funcionará. Así por ejemplo:

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, screenRect.size.width, 50)];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"This will be on the first line\nfollowed by a line under it.";
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
Roi
fuente
3

Si está utilizando un UILabel, debe recordar que la configuración predeterminada es 1 línea, por lo que no importa cuántos saltos agregue ( \no \r), debe asegurarse de que esté configurado en más de una línea para que se pueda agregar Más líneas.

Una alternativa es usar lo UITextViewque realmente está destinado a multilíneas.

Puede lograr esto fácilmente en la sección de atributos XCode de UILabel, vea la captura de pantalla:

ingrese la descripción de la imagen aquí

meda
fuente
3

Para aquellos de ustedes que desean una solución fácil, haga lo siguiente en el cuadro de entrada Etiqueta de texto:

Asegúrese de que sus líneas numéricas estén establecidas en 0.

Alt + Enter

(Alt es su clave de opción)

¡Salud!

Derrumbado
fuente
2

Solo usando label.numberOfLines = 0;

Freír
fuente
2

En mi caso, \ n tampoco funcionaba, solucioné el problema manteniendo el número de líneas en 0 y copié y pegué el texto con la nueva línea, por ejemplo, en lugar de Hello \ n World que pegué

Hola

Mundo

en el generador de interfaces.

Ranjithkumar
fuente
¡Excelente! Trabajos.
DmitryKanunnikoff
2

En xCode 11, Swift 5 \nfunciona bien, prueba el siguiente código:

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"
David_2877
fuente
1
textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);
usuario3182143
fuente
0

Para cualquier otra persona que pueda tener problemas sizeWithFont:constrainedToSize:lineBreakMode:o cambiar a ios8 (el método está en desuso a partir de ios7), ajusté mi altura usando en su sizeToFitlugar.

UILabel *label;
label.numberOfLines = 0;
// Setup label with desired settings
...
[label sizeToFit];
label.frame = CGRectMake(label.frame.origin.x,     // Or use any desired origin
                         label.frame.origin.y, 
                         label.frame.size.width,   // Or use any desired width
                         label.frame.size.height);
usuario3842937
fuente
0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
Grigori A.
fuente
0

Me parece incorrecto cambiar los tamaños de fotograma de la etiqueta, especialmente cuando se utiliza la distribución automática. Usar el método appendFormat parece más apropiado. Aquí está mi ejemplo:

NSMutableString *list = [[NSMutableString alloc] init];
NSArray *textArray = @[@"AAAA", @"BBBB"];
for (NSString *string in textArray) {
    [list appendFormat:@"%@\n", string.mutableCopy];
}
self.label.text = list;
self.label.numberOfLines = 0;
tanya
fuente
0

Si configura sus propiedades UILable de Plain a Attributed ... el UILabel retendrá texto multilínea sin importar cuántos párrafos durante el tiempo, ya que su altura y ancho UILabel están configurados para ajustarse al área de la pantalla en la que desea mostrar el texto.

BrainyMonkey
fuente
0

Me he enfrentado al mismo problema, y ​​aquí está, cómo resolví el problema. Espero que esto sea útil para alguien.

// Swift 2

   lblMultiline.lineBreakMode = .ByWordWrapping // or use NSLineBreakMode.ByWordWrapping
   lblMultiline.numberOfLines = 0 

// C objetivo

  lblMultiline.lineBreakMode = NSLineBreakByWordWrapping;
  lblMultiline.numberOfLines = 0;

// C # (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
Suraj Sonawane
fuente