¿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í?

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);

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.


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.


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


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.


22

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


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"
 }

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;

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];

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;

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í


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!



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.


¡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"

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);

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);

0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];

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;

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.


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;  
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.