Wie füge ich einen Zeilenumbruch für UILabel hinzu?


262

Mal sehen, dass ich einen String habe, der so aussieht:

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

Wie mache ich es so, dass das UILabel die Nachricht so anzeigt

AAAAA
BBBBB
CCCCC

Ich glaube nicht, dass \nUILabel es erkennt. Gibt es also etwas, das ich in NSString einfügen kann, damit UILabel weiß, dass es dort einen Zeilenumbruch verursachen muss?

Antworten:


332

Verwenden \nSie, wie Sie in Ihrer Zeichenfolge verwenden.

Setzen Sie numberOfLines auf 0, um eine beliebige Anzahl von Zeilen zuzulassen.

label.numberOfLines = 0;

Aktualisieren Sie den Beschriftungsrahmen mit der Größe des verwendeten Texts sizeWithFont:. Wenn Sie dies nicht tun, wird Ihr Text vertikal zentriert oder abgeschnitten.

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

Update: Ersatz für veraltet

sizeWithFont:constrainedToSize:lineBreakMode:

Referenz, Ersatz für veraltete GrößeWithFont: 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
UILabelhat noch keine originnor- sizeEigenschaft unter iOS? Es sollte wahrscheinlich sein label.frame.origin.xusw.
Peterdk

1
Anstatt sizeWithAttributes zu verwenden und dann den Rahmen festzulegen, können Sie einfach sizeToFit aufrufen, um die Rahmengröße in einem schnellen Schritt zu ermitteln und festzulegen.
Jimmyjudas

@Hermang, danke, dass du die Antwort bearbeitet hast, um sie auf den neuesten Stand zu bringen.
Gerry Shaw

274

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie die Option-Return, wenn Sie das kleine Feld in Interface Builder eingeben, um einen Zeilenvorschub (\ n) einzufügen. Setzen Sie in den Label-Attributen des Interface Builder # Lines = 0.

Wählen Sie die Beschriftung aus, ändern Sie die Lines-Eigenschaft wie im obigen Bild auf 0 und verwenden Sie dann \ n in Ihrer Zeichenfolge für den Zeilenumbruch.


2
das ist super nützlich!
Nitin Alabur

Ich habe für immer danach gesucht. Danke :)
Shai Mishali

Fantastische Antwort. Vielen Dank!
Macondo2Seattle

1
Funktioniert nicht, wenn die Beschriftung programmgesteuert festgelegt und \ n (Zeilenumbruch) zur Zeichenfolge hinzugefügt wird.
Chewie The Chorkie

tolle. Meine Anforderung war, dies nur mit dem Storyboard-Label zu tun. Und das funktionierte wie ein Zauber.
Tejas

132

Wenn Sie eine Zeichenfolge aus einer XML-Datei lesen, \nfunktioniert der Zeilenumbruch in dieser Zeichenfolge nicht im UILabelText. Das \nwird nicht zu einem Zeilenumbruch analysiert.

Hier ist ein kleiner Trick, um dieses Problem zu lösen:

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

myLabel.text = myLabelText;

Sie müssen also den nicht analysierten \nTeil in Ihrer Zeichenfolge durch einen \nin einem fest codierten Teil analysierten ersetzen NSString.

Hier sind meine anderen Etiketteneinstellungen:

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

Am wichtigsten ist es, numberOfLinesauf 0(= unbegrenzte Anzahl von Zeilen in der Beschriftung) zu setzen.

Keine Ahnung, warum Apple sich dafür entschieden hat, \naus XML gelesene Zeichenfolgen nicht zu analysieren ?

Hoffe das hilft.


1
iOS analysiert nicht, \nwenn Zeichenfolgen von Parse.com abgerufen werden (ich denke, es wird auch passieren, wenn Zeichenfolgen von anderen APIs abgerufen werden)
Brian

Du hast meinen Tag gerettet. Ich bekomme eine Zeichenfolge mit Zeilenumbruch aus XML-Dateien.
Senry

126

Im Interface Builder können Sie mit Ctrl+ an die gewünschte Position Entereinfügen /n. Auf diese Weise könnte die folgende Situation implementiert werden

aaa
aaaaaaa


Nein, ich habe nicht abgestimmt. Ich habe gerade die Antwort für eine bessere Präsentation bearbeitet.
Manoj Kumar

Also ganz einfach! +1
Marlonpya

2
Ich kann nicht glauben, dass ich diesen Trick nie gekannt habe! Ich hatte Shift-Enter versucht, weil das anderswo ziemlich normal ist. Dank dafür!
Echelon

das war genau das, wonach ich gesucht habe! danke +1!
Rickrvo

1
Guter Eintrag! Kleine Korrektur: Ich glaube du meinst Einfügen \ n statt Einfügen / n
Handwerk

25

Sie müssen die numberOfLinesEigenschaft auf dem festlegen UILabel. Der Standardwert ist 1 , wenn Sie ihn auf 0 setzen , werden alle Grenzwerte entfernt.


22

Es ist wichtig zu beachten, dass es \neher (Backslash) als /n.


10

In Swift 2.2> iOS 8

Ich habe im Storyboard unter Attributinspektor Zeilen = 0 festgelegt und einen Referenzierungsausgang mit dem Etikett verknüpft. Dann verwenden Sie in Controller wie folgt:

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

6

// Vergiss nicht, numberOfLines auf Null zu setzen

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

6

Mach es einfach so

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;

4

Unter Xcode 6 können Sie bei Verwendung des Zeilenumbruchs nur \ n auch innerhalb einer Zeichenfolge verwenden. Es wird klappen. Also zum Beispiel:

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

Wenn Sie a verwenden UILabel, müssen Sie sich daran erinnern, dass die Standardeinstellung 1 Zeile ist. Es spielt also keine Rolle, wie viele Unterbrechungen Sie hinzufügen ( \noder \r), Sie müssen sicherstellen, dass mehr als eine Zeile vorhanden ist, damit sie angehängt werden kann mehr Zeilen.

Eine Alternative ist die Verwendung, UITextViewdie wirklich für Multilines gedacht ist.

Sie können dies einfach im XCode-Attributabschnitt des UILabels erreichen, siehe Screenshot:

Geben Sie hier die Bildbeschreibung ein


3

Für diejenigen unter Ihnen, die eine einfache Lösung wünschen, gehen Sie im Eingabefeld Textbeschriftung wie folgt vor:

Stellen Sie sicher, dass Ihre Zahlenlinien auf 0 gesetzt sind.

Alt + Eingabetaste

(Alt ist Ihre Optionstaste)

Prost!



2

In meinem Fall funktionierte auch \ n nicht. Ich habe das Problem behoben, indem ich die Anzahl der Zeilen auf 0 gehalten und den Text kopiert und mit einer neuen Zeile eingefügt habe, z. B. anstelle von Hello \ n World, das ich eingefügt habe

Hallo

Welt

im Interface Builder.


Ausgezeichnet! Funktioniert.
DmitryKanunnikoff

2

In xCode 11, Swift 5 \nfunktioniert das einwandfrei , versuchen Sie den folgenden Code:

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

Für alle anderen, die Probleme mit sizeWithFont:constrainedToSize:lineBreakMode:ios8 haben könnten oder auf ios8 wechseln (die Methode ist ab ios7 veraltet), habe ich sizeToFitstattdessen meine Körpergröße angepasst .

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

Es scheint mir falsch, die Etikettenrahmengrößen zu ändern, insbesondere wenn Autolayout verwendet wird. Die Verwendung der appendFormat-Methode erscheint angemessener. Hier ist mein Beispiel:

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

Wenn Sie Ihre UILable-Eigenschaften von "Einfach" auf "Attributiert" festlegen, enthält das UILabel mehrzeiligen Text, unabhängig davon, wie viele Absätze zusammen mit Ihrer UILabel-Höhe und -Breite auf den Bildschirmbereich eingestellt sind, in dem Sie den Text anzeigen möchten.


0

Ich habe das gleiche Problem gehabt, und hier ist, wie ich das Problem gelöst habe. Hoffe das wird für jemanden hilfreich sein.

// Swift 2

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

// Ziel c

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

// C # (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.