Come aggiungere l'interruzione di linea per UILabel?


262

Vediamo che ho una stringa simile a questa:

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

Come posso fare in modo che UILabel visualizzi il messaggio in questo modo

AAAAA
BBBBB
CCCCC

Non credo che \nsia riconosciuto da UILabel, quindi c'è qualcosa che posso mettere dentro NSString in modo che UILabel sappia che deve creare un'interruzione di linea lì?

Risposte:


332

Usa \ncome stai usando nella tua stringa.

Impostare numberOfLines su 0 per consentire qualsiasi numero di righe.

label.numberOfLines = 0;

Aggiorna la cornice dell'etichetta in modo che corrisponda alla dimensione del testo utilizzando sizeWithFont:. In caso contrario, il testo verrà centrato verticalmente o troncato.

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

Aggiornamento: sostituzione per obsoleto

sizeWithFont:constrainedToSize:lineBreakMode:

Riferimento, sostituzione per dimensioni obsolete Con contenuto: in 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
UILabelnon ha una proprietà originsizesu iOS? Probabilmente dovrebbe essere label.frame.origin.xecc.
Peterdk,

1
Invece di usare sizeWithAttributes e quindi impostare il frame, puoi semplicemente chiamare sizeToFit per allenarti e impostare le dimensioni del frame in un solo passaggio.
jimmyjudas,

@Hermang, grazie per aver modificato la risposta per aggiornarla.
Gerry Shaw,

275

inserisci qui la descrizione dell'immagine

Utilizzare l'opzione return quando si digita nella casella piccola in Interface Builder per inserire un avanzamento riga (\ n). Negli attributi Etichetta di Interface Builder, imposta # Lines = 0.

Seleziona l'etichetta e quindi modifica la proprietà Lines su 0 come nell'immagine sopra, quindi usa \ n nella stringa per l'interruzione di riga.


2
questo è super utile!
Nitin Alabur,

Ho cercato questo per sempre. Grazie :)
Shai Mishali,

Risposta fantastica. Grazie!
Totoro Totoro

1
Non funziona quando si imposta l'etichetta a livello di codice e si aggiunge \ n (newline) alla stringa.
Chewie The Chorkie,

sorprendente. Il mio requisito era di farlo solo con l'etichetta dello storyboard. E questo ha funzionato come un fascino.
Tejas,

132

Se leggi una stringa da un file XML, l'interruzione di riga \nin questa stringa non funzionerà nel UILabeltesto. Non \nviene analizzato a un'interruzione di riga.

Ecco un piccolo trucco per risolvere questo problema:

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

myLabel.text = myLabelText;

Quindi devi sostituire la \nparte non analizzata nella tua stringa con una parsed \nin un hardcoded NSString.

Ecco le mie altre impostazioni dell'etichetta:

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

La cosa più importante è impostare numberOfLinessu 0(= numero illimitato di righe nell'etichetta).

Non hai idea del perché Apple abbia scelto di non analizzare le \nstringhe lette da XML?

Spero che questo ti aiuti.


1
iOS non analizza \nquando si ottengono stringhe da Parse.com (suppongo che accadrà anche quando si ottengono stringhe da altre API)
Brian

Mi hai salvato la giornata. Ricevo una stringa con newline da file xml.
Senry,

127

Nel builder di interfacce, puoi usare Ctrl+ Enterper inserire /nla posizione desiderata. In questo modo è possibile implementare la seguente situazione

aaa
aaaaaaa


No, non ho espresso il mio voto negativo. Ho appena modificato la risposta per una migliore presentazione.
m4n0,

Così davvero semplice! +1
marlonpya,

2
Non posso credere di non aver mai conosciuto quel trucco! Avevo provato Shift-Enter perché è abbastanza standard altrove. Grazie per quello!
Echelon,

questo era esattamente quello che stavo cercando! grazie +1!
rickrvo,

1
Ottimo post! Piccola correzione: Credo che tu inserto media \ n invece di inserimento / n
artigianale

25

Devi impostare la numberOfLinesproprietà su UILabel. Il valore predefinito è 1 , se lo si imposta su 0 rimuoverà tutti i limiti.


22

È importante notare che è \n(barra rovesciata) anziché /n.


10

In Swift 2.2,> iOS 8

Ho impostato Lines = 0 su Storyboard, in Attribute Inspector e collegato un punto di riferimento all'etichetta. Quindi utilizzare nel controller in questo modo:

 @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

Fallo così

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;

Funziona .. :)
Bibin Joseph

6

// NON dimenticare di impostare numberOfLines su 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];

4

Su Xcode 6, puoi usare \ n anche all'interno di una stringa quando usi il ritorno a capo automatico. Funzionerà. Quindi per esempio:

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

Se UILabelstai usando a devi ricordare che l'impostazione predefinita è 1 riga, quindi non importa quante interruzioni aggiungi ( \no \r), devi assicurarti che sia impostato su più di una riga in modo da poter aggiungere più righe.

Un'alternativa è l'uso UITextViewche è veramente pensato per le multiline.

Puoi facilmente ottenerlo nella sezione degli attributi XCode di UILabel, vedi screenshot:

inserisci qui la descrizione dell'immagine


3

Per quelli di voi che desiderano una soluzione semplice, effettuate le seguenti operazioni nella casella di input Etichetta testo:

Assicurarsi che le linee dei numeri siano impostate su 0.

Alt + Invio

(Alt è il tasto opzione)

Saluti!



2

Nel mio caso anche \ n non funzionava, ho risolto il problema mantenendo il numero di righe su 0 e copiato e incollato il testo con la nuova riga stessa, ad esempio invece di Hello \ n World i incollato

Ciao

Mondo

nel generatore di interfaccia.


Eccellente! Lavori.
DmitryKanunnikoff il

2

In xCode 11, Swift 5 \nfunziona perfettamente, prova il codice seguente:

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

Per chiunque abbia problemi con sizeWithFont:constrainedToSize:lineBreakMode:o chiunque passi a iOS8 (il metodo è obsoleto a partire da iOS7), ho regolato la mia altezza usando sizeToFitinvece.

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

Mi sembra sbagliato modificare le dimensioni della cornice dell'etichetta, specialmente quando si utilizza il layout automatico. L'uso del metodo appendFormat sembra più appropriato. Ecco il mio esempio:

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

Se imposti le tue proprietà UILable da Semplice ad Attribuito ... UILabel manterrà il testo su più righe indipendentemente dal numero di paragrafi lungo quanto l'altezza e la larghezza di UILabel sono impostate per adattarsi all'area dello schermo in cui desideri visualizzare il testo.


0

Ho affrontato lo stesso problema, ed ecco come ho risolto il problema. Spero che questo sia utile per qualcuno.

// Swift 2

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

// Obiettivo-C

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

// C # (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.