Mehrere Textzeilen in UILabel


443

Gibt es eine Möglichkeit, mehrere Textzeilen UILabelwie in der zu verwenden, UITextViewoder sollte ich stattdessen die zweite verwenden?


5
Beachten Sie, dass UILineBreakModeWordWrapin iOS 6 veraltet war. Sie sollten jetzt verwenden NSLineBreakByWordWrapping = 0Siehe Dokumentation hier
Austin

Antworten:


796

Ich habe eine Lösung gefunden.

Man muss nur den folgenden Code hinzufügen:

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

Wiederhergestellte alte Antwort (als Referenz und Entwickler, die bereit sind, iOS unter 6.0 zu unterstützen):

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

Nebenbei: Beide Enum-Werte ergeben 0sowieso.


16
UILineBreakModeWordWrap ist eigentlich die Standardeinstellung, sodass Sie die erste Zeile nicht benötigen.
Jarred Olson

1
Für diejenigen, die Swift verwenden: cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingundcell.textLabel?.numberOfLines = 0
Boidkan

5
Vielen Dank, dass Sie auch Xamarin-Code bereitgestellt haben. Autocompletion hat nicht funktioniert, weil sie diese Eigenschaft abgekürzt haben ... +1
Jan Gillich

Ich stimme Jarred Olson zu, NSLineBreakByWordWrapping ist Standard . Ich habe die Eigenschaft sizeToFit wie die Anleitung von Gurumoorthy Arumugam hinzugefügt, um das Problem zu beheben. Wenn Sie möchten, dass sich die Schriftart in Ihrem Etikett an die Grenzen des Etiketts anpasst. Sie können verwenden: textLabel.adjustsFontSizeToFitWidth = YES; Vielen Dank an alle.
Ryan Tran

@JarredOlson Docs sagen "Diese Eigenschaft ist standardmäßig auf byTruncatingTail eingestellt."
Bill

138

Setzen Sie in IB die Anzahl der Zeilen auf 0 (erlaubt unbegrenzte Zeilen)

Wenn Sie mit IB in das Textfeld eingeben, verwenden Sie "Alt-Return", um eine Rückgabe einzufügen und zur nächsten Zeile zu wechseln (oder Sie können Text kopieren, der bereits durch Zeilen getrennt ist).


1
[Da er wissentlich einen mehr als ein Jahr alten Thread ausgräbt…] Ich wünschte manchmal, ich könnte in IB Text ohne eingebettete Zeilenumbrüche eingeben, UILineBreakModeWordWrap und numberOfLines = 0 setzen und dann die Beschriftung automatisch verwenden -Größen Sie die Höhe automatisch, während Sie noch in IB entwerfen. Ich denke an den Fall, in dem die Größe der Ansicht auf Querformat geändert wird und Zeilenumbrüche in der Beschriftung problematisch sein können. Oder ... ich könnte IB missbrauchen! Vielleicht verursacht die automatische Größenänderung der Etiketten innerhalb von IB mehr Probleme als sie lösen? (Außerdem können Sie sizeToFit derzeit noch nicht aufrufen.)
Joe D'Andrea

Die "0", die ich aus den Dokumenten für UILabel erhalten habe, die Alt-Rückkehr von einem Freund, der Interface Builder seit vielen Jahren verwendet.
Kendall Helmstetter Gelner

3
+1 für die einzige Antwort, die "Alt-Return" erwähnt. Insbesondere "Strg-Rückgabe" scheint zu funktionieren, funktioniert aber nicht.
Paulmelnikow

52

Die beste Lösung, die ich gefunden habe (für ein ansonsten frustrierendes Problem, das im Framework hätte gelöst werden sollen), ähnelt der von vaychick.

Setzen Sie einfach die Anzahl der Zeilen in IB oder Code auf 0

myLabel.numberOfLines = 0;

Dadurch werden die benötigten Linien angezeigt, aber die Beschriftung wird so positioniert, dass sie horizontal zentriert ist (sodass eine Beschriftung mit 1 Zeile und 3 Zeilen in ihrer horizontalen Position ausgerichtet ist). Um dies zu beheben, fügen Sie Folgendes hinzu:

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;

Löse meine Frage mit Hilfe von dir und @Ilya Suzdalnitski. Vielen Dank.
Mihir Oza

33

Verwenden Sie diese Option, um mehrere Textzeilen in UILabel:

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

Schnell:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

Wenn Sie Folgendes verwenden müssen:

myLabel.numberOfLines = 0;

Eigenschaft Sie können auch einen Standard-Zeilenumbruch ("\n")im Code verwenden, um eine neue Zeile zu erzwingen.


15

Sie können verwendet werden \rzur nächsten Zeile zu gehen , während das Auffüllen UILabelmit NSString.

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];

14

Lass uns das versuchen

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          

Dies kann auch im gesamten IB-Attribut 'Lines' auf UILabel auf 0 gesetzt werden.
KoreanXcodeWorker

11
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

Die obige Lösung funktioniert in meinem Fall nicht. Ich mache das so:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}


8

Swift 3
Setzen Sie die Anzahl der Zeilen für dynamische Textinformationen auf Null. Dies ist nützlich, um Text zu variieren.

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame

Geben Sie hier die Bildbeschreibung ein


1
Danke Krunal, es funktioniert für mich!
Yogesh Patel

6
UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

Aus einigen Gründen funktioniert es bei iOS 6 nicht, ich weiß nicht warum. Versuchte es mit und ohne zugeschriebenen Text. Irgendwelche Vorschläge.


6

Versuchen Sie Folgendes:

lblName.numberOfLines = 0;
[lblName sizeToFit];

sizeToFit funktioniert nicht, wenn numberOfLine von 0 abweicht. Es ist interessant.
Onur Thunfisch

3

Diese Dinge haben mir geholfen

Ändern Sie diese Eigenschaften von UILabel

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

Und während Sie den Eingabe-String geben, verwenden Sie \ n, um verschiedene Wörter in verschiedenen Zeilen anzuzeigen.

Beispiel:

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;

3

Methode 1:

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Rufen Sie jetzt einfach so an

myLbl.lblFunction()//Replace your label name 

EX:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Methode 2:

Programmatisch

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

Methode 3:

Durch das Storyboard

Um mehrere Zeilen anzuzeigen, setzen Sie 0 (Null). Dadurch wird mehr als eine Zeile in Ihrem Etikett angezeigt.

Wenn Sie n Zeilen anzeigen möchten, setzen Sie n.

Siehe unten Bildschirm.

Geben Sie hier die Bildbeschreibung ein

Wenn Sie die Mindestschriftgröße für die Beschriftung festlegen möchten, klicken Sie auf Automatisch verkleinern und wählen Sie die Option Mindestschriftgröße

Siehe unten stehende Bildschirme

Geben Sie hier die Bildbeschreibung ein

Hier stellen Sie die minimale Schriftgröße ein

EX: 9 (In diesem Bild)

Wenn Ihr Etikett zu diesem Zeitpunkt mehr Text erhält, wird Ihr Etikettentext auf 9 verkleinert

Geben Sie hier die Bildbeschreibung ein


2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

Vergessen Sie nicht hinzuzufügen: [labelName setLineBreakMode: NSLineBreakByWordWrapping];
Irineu leckt Filho

2

Sie können dies auch über das Storyboard tun:

  1. Wählen Sie die Beschriftung auf dem Ansichts-Controller aus
  2. Erhöhen Sie im Attributinspektor den Wert der Option Linie (Drücken Sie Alt + Befehlstaste + 4, um den Attributinspektor anzuzeigen).
  3. Doppelklicken Sie im Ansichts-Controller auf die Beschriftung und schreiben oder fügen Sie Ihren Text ein
  4. Ändern Sie die Größe der Beschriftung und / oder erhöhen Sie die Schriftgröße, damit der gesamte Text angezeigt werden kann

und setzen Sie Zeilen auf 0, andernfalls wird nur Text angezeigt, der in die angegebene Anzahl von Zeilen eingefügt werden kann, andere werden weggelassen.
toing_toing

2

Sie sollten dies versuchen:

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}

1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";

1

Bereits beantwortet, aber Sie können dies auch manuell im Storyboard tun. Unter Attributinspektor für die Beschriftung können Sie Zeilenumbrüche in Zeilenumbruch (oder Zeichenumbruch) ändern.


1

In dieser Funktion übergeben Sie die Zeichenfolge, die Sie in der Beschriftung zuweisen möchten, und übergeben die Schriftgröße anstelle von self.activityFont. Übergeben Sie die Beschriftungsbreite anstelle von 235. Jetzt erhalten Sie die Beschriftungshöhe entsprechend Ihrer Zeichenfolge. es wird gut funktionieren.

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}

1

Stellen Sie unten entweder im Code oder im Storyboard selbst ein

Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;

und bitte vergessen Sie nicht, die Einschränkungen für die Beschriftung links, rechts, oben und unten festzulegen, da dies sonst nicht funktioniert.


Überall heißt es, Zeilenumbruch und Anzahl der Zeilen auf 0 zu setzen. Aber meiner hat immer noch nicht umgebrochen. Durch Festlegen der Einschränkung für links, oben, unten und rechts wurde der Vorgang abgeschlossen.
anoo_radha

1

Swift 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

0

Auf C # funktionierte dies für mich in UITableViewCell.

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

Ich denke, der Punkt hier ist: -

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;

-2

Dieser Code gibt die Größenhöhe gemäß Text zurück

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
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.