Ich habe derzeit eine UILabel
:
factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)];
factLabel.text = @"some text some text some text some text";
factLabel.backgroundColor = [UIColor clearColor];
factLabel.lineBreakMode = UILineBreakModeWordWrap;
factLabel.numberOfLines = 10;
[self.view addSubview:factLabel];
Während der gesamten Lebensdauer meiner iOS-Anwendung werden factLabel
verschiedene Werte angezeigt. Einige mit mehreren Sätzen, andere mit nur 5 oder 6 Wörtern.
Wie kann ich das UILabel
so einrichten, dass sich die Schriftgröße ändert, sodass der Text immer in die von mir definierten Grenzen passt?
ios
objective-c
fonts
uilabel
CodeGuy
quelle
quelle
Antworten:
Einzelne Zeile:
Mit dem obigen Code wird die Schriftgröße Ihres Textes so angepasst, dass (zum Beispiel)
8
versucht wird, Ihren Text in die Beschriftung einzufügen.numberOfLines = 1
ist obligatorisch.Mehrere Zeilen:
Denn
numberOfLines > 1
es gibt eine Methode, um die Größe des endgültigen Textes mithilfe von NSStrings sizeWithFont: ... UIKit-Additionsmethoden zu ermitteln, zum Beispiel:Danach können Sie einfach die Größe Ihres Etiketts ändern
lLabelSize
, indem Sie beispielsweise das Ergebnis verwenden (vorausgesetzt, Sie ändern nur die Höhe des Etiketts):iOS6
Einzelne Zeile:
Ab iOS6
minimumFontSize
ist veraltet. Die Liniekann geändert werden zu:
iOS7
Mehrere Zeilen:
Ab iOS7
sizeWithFont
wird es veraltet. Der mehrzeilige Fall reduziert sich auf:iOS 13 (Swift 5):
quelle
sizeWithFont:constrainedToSize:lineBreakMode:
Aber dieser Weg ist ein bisschen schwierigmyLabel.minimumScaleFactor:10.0/[UIFont labelFontSize];
minimumFontSize
wurde mit iOS 6 veraltet. Sie können verwendenminimumScaleFactor
.Dadurch wird Ihre Schriftgröße entsprechend der Breite des Etiketts und des Texts berücksichtigt.
quelle
adjustsFontSizeToFitWidth
reduziert nur Text, wenn er nicht in den Container passtBasierend auf der Antwort von @Eyal Ben Dov möchten Sie möglicherweise eine Kategorie erstellen, um die Verwendung in anderen Apps von Ihnen flexibel zu gestalten.
Hinweis: Ich habe seinen Code aktualisiert, um ihn mit iOS 7 kompatibel zu machen
-Header-Datei
-Implementierungsdatei
-Verwendung
Prost
quelle
setNeedsLayout
/ auf,layoutIfNeeded
wenn Sie AutoLayout verwenden).Einzeilig - Es gibt zwei Möglichkeiten, die Sie einfach ändern können.
1- Pragmatisch (Swift 3)
Fügen Sie einfach den folgenden Code hinzu
2 - Verwenden des UILabel-Attributinspektors
quelle
Es ist 2015. Ich musste einen Blog-Beitrag suchen, in dem erklärt wurde, wie dies für die neueste Version von iOS und XCode mit Swift gemacht wird, damit es mit mehreren Zeilen funktioniert.
Quelle: http://beckyhansmeyer.com/2015/04/09/autoshrinking-text-in-a-multiline-uilabel/
quelle
Schnelle Version:
quelle
Hier ist eine Swift-Erweiterung für UILabel. Es wird ein binärer Suchalgorithmus ausgeführt, um die Schriftgröße basierend auf der Breite und Höhe der Beschriftungsgrenzen zu ändern. Getestet für iOS 9 und Autolayout.
VERWENDUNG: Wo
<label>
befindet sich Ihr vordefiniertes UILabel, dessen Schriftgröße geändert werden muss?Standardmäßig sucht diese Funktion im Bereich von 5pt- und 300pt-Schriftgrößen und legt die Schriftart so fest, dass ihr Text "perfekt" innerhalb der Grenzen liegt (genau innerhalb von 1,0pt). Sie können die Parameter so definieren, dass beispielsweise zwischen 1 Punkt und der aktuellen Schriftgröße des Etiketts innerhalb von 0,1 Punkten auf folgende Weise genau gesucht wird:
Kopieren Sie den folgenden Code in Ihre Datei
HINWEIS: Jeder
layoutIfNeeded()
Anruf kann nach eigenem Ermessen entfernt werdenquelle
Es ist ein bisschen nicht raffiniert, aber das sollte funktionieren. Nehmen wir zum Beispiel an, Sie möchten Ihr Uilabel auf 120 x 120 mit einer maximalen Schriftgröße von 28 begrenzen:
quelle
Senden Sie einfach die sizeToFit-Nachricht an UITextView. Es passt seine eigene Höhe an den Text an. Die eigene Breite oder Herkunft wird nicht geändert.
quelle
sizeToFit
IhretextViewA1
200 Punkte aufgerufen haben, was dazu führt, dass sie abgeschnitten werden.Swift 2.0 Version:
quelle
Diese Lösung funktioniert für mehrzeilige:
Nachdem ich mehreren Artikeln gefolgt war und eine Funktion benötigt hatte, die den Text automatisch skaliert und die Zeilenanzahl so anpasst, dass sie am besten zur angegebenen Etikettengröße passt, habe ich selbst eine Funktion geschrieben. (dh eine kurze Zeichenfolge würde gut in eine Zeile passen und einen großen Teil des Etikettenrahmens verwenden, während eine lange starke Zeichenfolge automatisch in 2 oder 3 Zeilen aufgeteilt und die Größe entsprechend angepasst würde)
Fühlen Sie sich frei, es wiederzuverwenden und nach Bedarf zu optimieren. Stellen Sie sicher, dass Sie es nach
viewDidLayoutSubviews
Abschluss aufrufen, damit der ursprüngliche Beschriftungsrahmen festgelegt wurde.quelle
Hier ist der Füllcode einer UILabel-Unterklasse, die eine animierte Änderung der Schriftgröße implementiert:
quelle