Gibt es eine Möglichkeit, mehrere Textzeilen UILabel
wie in der zu verwenden, UITextView
oder sollte ich stattdessen die zweite verwenden?
Gibt es eine Möglichkeit, mehrere Textzeilen UILabel
wie in der zu verwenden, UITextView
oder sollte ich stattdessen die zweite verwenden?
Antworten:
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 0
sowieso.
cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
undcell.textLabel?.numberOfLines = 0
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).
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;
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];
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.
Lass uns das versuchen
textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated
textLabel.numberOfLines = 0;
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);
//...
}
Verwenden Geschichte borad: Wählen Sie das Etikett festgelegte Anzahl von Zeilen auf Null ...... Oder finden Sie diese
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
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.
Versuchen Sie Folgendes:
lblName.numberOfLines = 0;
[lblName sizeToFit];
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" ;
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.
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
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
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];
Sie können dies auch über das Storyboard tun:
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;
}
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";
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;
}
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.
Swift 4:
label.lineBreakMode = .byWordWrapping
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.preferredMaxLayoutWidth = superview.bounds.size.width - 10
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;
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;
}
UILineBreakModeWordWrap
in iOS 6 veraltet war. Sie sollten jetzt verwendenNSLineBreakByWordWrapping = 0
Siehe Dokumentation hier