Mehrere Textzeilen in UILabel

443

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

Ilya Suzdalnitski
quelle
5
Beachten Sie, dass UILineBreakModeWordWrapin iOS 6 veraltet war. Sie sollten jetzt verwenden NSLineBreakByWordWrapping = 0Siehe Dokumentation hier
Austin
Überprüfen Sie diese Frage stackoverflow.com/questions/2312899/…
user1766342

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.

Ilya Suzdalnitski
quelle
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).

Kendall Helmstetter Gelner
quelle
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;
Michael Michailidis
quelle
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
Abi
quelle
21
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];
Gurumoorthy Arumugam
quelle
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.

Tim Maher-De Troyer
quelle
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"];
Prajul
quelle
14

Lass uns das versuchen

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          
user40910
quelle
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);

    //...
}
Bartolo-Otrit
quelle
8

Verwenden Geschichte borad: Wählen Sie das Etikett festgelegte Anzahl von Zeilen auf Null ...... Oder finden Sie diese

Geben Sie hier die Bildbeschreibung ein

Vijay Sharma
quelle
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

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

Rajashekar
quelle
6

Versuchen Sie Folgendes:

lblName.numberOfLines = 0;
[lblName sizeToFit];
Mubin Shaikh
quelle
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" ;
iPhoneDeveloper
quelle
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

iOS
quelle
2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];
Gaurav Gilani
quelle
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
OsLivon
quelle
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;
}
Pritesh
quelle
1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";
Gaurav Gilani
quelle
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.

Fleija
quelle
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;

}
Nripendra singh
quelle
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.

Ankit garg
quelle
Ü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 
Sumona Salma
quelle
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;
AG
quelle
-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;
}
Gaurav
quelle