Como adicionar quebra de linha para o UILabel?

262

Vamos ver que eu tenho uma string assim:

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

Como faço para que o UILabel exiba a mensagem como esta

AAAAA
BBBBB
CCCCC

Eu não acho que \nseja reconhecido pelo UILabel, então há algo que eu possa colocar dentro do NSString para que o UILabel saiba que precisa criar uma quebra de linha lá?

Thang Pham
fonte

Respostas:

332

Usar \n como você está usando em sua string.

Defina numberOfLines como 0 para permitir qualquer número de linhas.

label.numberOfLines = 0;

Atualize o quadro de etiqueta para corresponder ao tamanho do texto usando sizeWithFont:. Se você não fizer isso, seu texto será centralizado verticalmente ou cortado.

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

Atualização: substituição por obsoleta

sizeWithFont:constrainedToSize:lineBreakMode:

Referência, Substituição por tamanho descontinuado

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
fonte
2
UILabelnão tem uma propriedade originnem sizeno iOS? Provavelmente deve ser label.frame.origin.xetc.
Peterdk
1
Em vez de usar sizeWithAttributes e definir o quadro, basta chamar sizeToFit para resolver e definir o tamanho do quadro em uma etapa rápida.
Jimmyjudas
@ Hermang, obrigado por editar a resposta para atualizá-la.
Gerry Shaw
275

insira a descrição da imagem aqui

Use Option-Return ao digitar na pequena caixa no Interface Builder para inserir um avanço de linha (\ n). Nos atributos Rótulo do Interface Builder, defina # Lines = 0.

Selecione o rótulo e altere a propriedade Linhas para 0, como na imagem acima, e use \ n na sua sequência para quebra de linha.

Marco
fonte
2
isso é super útil!
Nitin Alabur
Procurou isso para sempre. Obrigado :)
Shai Mishali
Resposta fantástica. Obrigado!
Macondo2Seattle
1
Não funciona ao definir o rótulo programaticamente e adicionar \ n (nova linha) à string.
Chewie The Chorkie
surpreendente. Minha exigência era fazer isso apenas com o rótulo do storyboard. E isso funcionou como um encanto.
Tejas
132

Se você ler uma sequência de um arquivo XML, a quebra de linha \ndessa sequência não funcionará em UILabeltexto. o\n não é analisado para uma quebra de linha.

Aqui está um pequeno truque para resolver esse problema:

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

myLabel.text = myLabelText;

Portanto, você deve substituir a \nparte não analisada em sua string por uma analisada \nem um código codificado NSString.

Aqui estão minhas outras configurações de marcador:

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

O mais importante é definir numberOfLinescomo 0(= número ilimitado de linhas no rótulo).

Não faço ideia por que a Apple optou por não analisar as \nstrings lidas no XML?

Espero que isto ajude.

Al-Noor Ladhani
fonte
1
iOS não analisar \nquando chegar cordas de Parse.com (acho que também vai acontecer quando chegar a corda de outras APIs)
Brian
Você salvou o meu dia. Estou recebendo string com nova linha de arquivos xml.
Senry
127

No construtor de interface, você pode usar Ctrl+ Enterpara inserir /nna posição desejada. Desta forma, poderia implementar a seguinte situação

aaa
aaaaaaa

kuokuo321
fonte
Não, eu não votei. Acabei de editar a resposta para uma melhor apresentação.
M4n0 13/11/2015
Tão realmente simples! 1
marlonpya
2
Não posso acreditar que nunca conheci esse truque! Eu tentei shift-Enter, porque isso é bastante comum em outros lugares. Obrigado por isso!
Echelon
era exatamente isso que eu estava procurando! obrigado +1!
Rpgvo 21/05/19
1
Ótimo post! Correção pequena: acredito que você quer dizer inserir \ n em vez de inserir / n
craft
25

Você precisa definir a numberOfLinespropriedade no UILabel. O padrão é 1 , se você defini-lo como 0 , todos os limites serão removidos.

Dan
fonte
22

Importante notar que é \n(barra invertida) e não /n.

AndyOng
fonte
10

No Swift 2.2,> iOS 8

Eu configurei Lines = 0 no Storyboard, no Attribute Inspector e vinculei uma saída de referência ao rótulo. Em seguida, use no controlador como este:

 @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
fonte
7

Apenas faça assim

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
fonte
Está funcionando .. :)
Bibin Joseph
6

// NÃO se esqueça de definir numberOfLines como zero

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
fonte
4

No Xcode 6, você pode usar \ n mesmo dentro de uma string ao usar quebra de linha. Vai funcionar. Então, por exemplo:

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
fonte
3

Se você estiver usando um UILabel, lembre-se de que a configuração padrão é 1 linha; portanto, não importa quantas quebras você adicionar ( \nou \r), verifique se ele está definido para mais de uma linha, para poder anexar mais linhas.

Uma alternativa é usar o UITextViewque é realmente destinado a multilinhas.

Você pode conseguir isso facilmente na seção de atributos XCode do UILabel, veja a captura de tela:

insira a descrição da imagem aqui

meda
fonte
3

Para aqueles que desejam uma solução fácil, faça o seguinte na caixa de entrada Rótulo do texto:

Verifique se as linhas numéricas estão definidas como 0.

Alt + Enter

(Alt é sua tecla de opção)

Felicidades!

Derwrecked
fonte
2

Apenas usando label.numberOfLines = 0;

Fritar
fonte
2

No meu caso, também \ n não estava funcionando, resolvi o problema mantendo o número de linhas em 0 e copiei e colei o texto com a nova linha, por exemplo, em vez de Hello \ n World que colei

Olá

Mundo

no construtor de interface.

Ranjithkumar
fonte
Excelente! Trabalho.
DmitryKanunnikoff
2

No xCode 11, o Swift 5 \nfunciona bem, tente o código abaixo:

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"
David_2877
fonte
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);
user3182143
fonte
0

Para qualquer outra pessoa que possa ter problemas sizeWithFont:constrainedToSize:lineBreakMode:ou mudar para o ios8 (o método foi descontinuado a partir do ios7), ajustei minha altura usando sizeToFit.

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);
user3842937
fonte
0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
Grigori A.
fonte
0

Parece-me errado alterar os tamanhos dos quadros de etiquetas, especialmente ao usar o layout automático. O uso do método appendFormat parece mais apropriado. Aqui está o meu exemplo:

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
fonte
0

Se você definir suas propriedades UILable de Simples para Atribuído ... o UILabel conterá texto de várias linhas, não importa quantos parágrafos, enquanto sua altura e largura do UILabel estiverem definidas para caber na área da tela em que você deseja exibir o texto.

BrainyMonkey
fonte
0

Eu enfrentei o mesmo problema, e aqui está como eu resolvi o problema. Espero que isso seja útil para alguém.

// Swift 2

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

// Objetivo-C

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

// C # (Xamarin.iOS)

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