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?

Thang Pham
quelle

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);
Gerry Shaw
quelle
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.

Marco
quelle
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.

Al-Noor Ladhani
quelle
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

kuokuo321
quelle
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.

Dan
quelle
22

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

AndyOng
quelle
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"
 }
CodeOverRide
quelle
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];
Pankaj Chauhan
quelle
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;
Sandip Patel - SM
quelle
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;
Roi
quelle
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

meda
quelle
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!

Derwrecked
quelle
2

Nur mit label.numberOfLines = 0;

Braten
quelle
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.

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

BrainyMonkey
quelle
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;  
Suraj Sonawane
quelle