Ich habe dieses seltsame Problem und beschäftige mich jetzt seit mehr als 8 Stunden damit. Je nach Situation muss ich die UILabels
Größe dynamisch berechnen ,
z. B. empfange
ich UIViewController
ein Ereignis und ändere die UILabels
Größe. von größer zu kleiner. Die Größe meiner UILabel
Schrift wird kleiner und ich bekomme die richtige benötigte Größe, aber der Text in meiner UILabel
bleibt gleich, die gleiche Schriftgröße usw. Ich brauche die Schrift, um kleiner zu werden, damit der gesamte Text passt UILabel
. Die Frage ist also, wie der Text zu meinem Etikett passt autoshrinking
oder so?
In meinem xib
, UILabels
autoshrink
wird geprüft, auch Anzahl der Zeilen auf 0 gesetzt ist, und auch neue Liniensymbole (\ n) mein String hat, und ich habe ausgewählt linebreak zu wordwrap
. Vielleicht war jemand in der gleichen Situation wie ich und könnte mir helfen? Das würde ich sehr schätzen.
Danke im Voraus!
BEARBEITEN: Die UILabel
minimale Schriftgröße ist auf 10 eingestellt
quelle
Antworten:
Falls Sie immer noch nach einer besseren Lösung suchen, ist dies meiner Meinung nach das, was Sie wollen:
Ein boolescher Wert, der angibt, ob die Schriftgröße reduziert werden soll, um die Titelzeichenfolge in das Begrenzungsrechteck der Beschriftung einzufügen (diese Eigenschaft ist nur wirksam, wenn die
numberOfLines
Eigenschaft auf 1 festgelegt ist).Wenn Sie diese Eigenschaft
minimumScaleFactor
festlegen , MUSS auch festgelegt werden (ein guter Standardwert ist 0,5).Schnell
Ziel c
Ein boolescher Wert, der angibt, ob der Abstand zwischen Buchstaben so angepasst werden soll, dass die Zeichenfolge in das Begrenzungsrechteck der Beschriftung passt.
Schnell
Ziel c
Quelle .
quelle
minimumFontSize
ist in iOS 6.0 veraltet. Verwenden SieminimumScaleFactor
stattdessen.Auf diese Weise
Autoshrink
funktioniert UILabel in iOS 9.2, Xcode 7.2 ...quelle
minimumFontSize
ist in iOS 6 veraltet.Verwenden Sie also
minimumScaleFactor
anstelle vonminmimumFontSize
.Swift 5
quelle
Meine Lösung ist auch das boolesche Label.adjustsFontSizeToFitWidth = YES; ABER. Sie müssen im Interface Builder den Word Wrapping-Schalter auf " CLIP " stellen. Dann schrumpfen Sie die Etiketten automatisch. Dies ist sehr wichtig.
quelle
In Swift 3 (programmatisch) musste ich Folgendes tun:
quelle
Du kannst gerne schreiben
Sie können die Anzahl der Zeilen so berechnen
Hoffe das hilft dir :-) warte auf deine Antwort
quelle
Am Ende habe ich meine Antwort nicht gefunden. Und ich denke, der Autoshrink funktioniert nicht für mehrere Zeilen. Am Ende habe ich in diesem Link einen Vorschlag verwendet: Autoshrink auf einem UILabel mit mehreren Zeilen
Die Lösung besteht darin, die Texthöhe bei gegebener Breite zu berechnen. Wenn der Text größer ist, verkleinern Sie die Schriftgröße und wiederholen Sie den Vorgang, bis die Höhe der gewünschten Größe entspricht oder darunter liegt.
Ich verstehe nicht, warum dies so schwer umzusetzen sein sollte. Wenn mir etwas fehlt, kann mich jeder gerne korrigieren :)
quelle
Dies ist für Swift 3 mit Xcode 8.2.1 (8C1002)
Die beste Lösung, die ich gefunden habe, besteht darin, eine feste Breite in Ihrem Storyboard oder IB auf dem Etikett festzulegen. Setzen Sie Ihre Einschränkungen mit Einschränkung auf Ränder. Fügen Sie in Ihrem viewDidLoad die folgenden Codezeilen hinzu:
Dies funktionierte wie ein Zauber und es läuft nicht in eine neue Zeile über und verkleinert den Text, um die Breite des Etiketts ohne seltsame Probleme anzupassen, und funktioniert in Swift 3.
quelle
Das ist eine großartige Frage, denn es scheint, dass dies
UIKit
mittlerweile Teil der integrierten Funktionalität oder eines verwandten Frameworks ist. Hier ist ein gutes visuelles Beispiel für die Frage:Es gibt keinen einfachen Weg, aber es ist definitiv möglich. Eine Möglichkeit, dies zu tun, besteht darin, programmgesteuert verschiedene Schriftgrößen auszuprobieren, bis Sie eine finden, die den Grenzen der Ansicht angemessen nahe kommt. Sie können dies mit der
boundingRect()
Funktion vonNSString
oder erreichenNSAttributedString
. Beispielsweise:Sie können eine binäre Suche durchführen, um effizienter zu sein als ein vollständiger Brute-Force-Ansatz. Es gibt auch einige Überlegungen, die etwas komplizierter sind, einschließlich des korrekten Zeilenumbruchs und der Caching-Leistung von iOS-Schriftarten, wenn Sie nach etwas wirklich Robustem suchen.
Wenn Sie den Text nur auf einfache Weise auf dem Bildschirm anzeigen möchten, habe ich in Swift eine robuste Implementierung entwickelt, die ich auch in einer Produktions-App verwende. Es ist eine
UIView
Unterklasse mit effizienter, automatischer Schriftskalierung für jeden Eingabetext, einschließlich mehrerer Zeilen. Um es zu benutzen, würden Sie einfach etwas tun wie:Das ist es! Die vollständige Quelle finden Sie hier: https://github.com/FlickType/AccessibilityKit
Hoffe das hilft!
quelle
In iOS 9 musste ich nur:
Jemand hat empfohlen, die Anzahl der Zeilen auf 0 zu setzen, aber für mich hat dies nur dazu geführt, dass das Etikett mehrere Zeilen umfasst ...
quelle
UILabel
und aUITextField
in einer statischen Zelle ausgewählt und auf "AutoLayout-Probleme beheben" und "Fehlende Einschränkungen hinzufügen" geklickt. Alles stimmte überein, aber Autoshrink musste den Abstand zum Etikett kennen, für den "Add Missing Constraints" keine Einschränkung hinzufügte.Ich denke, Sie können folgenden Code schreiben, nachdem Sie init Label zugewiesen haben
Es funktioniert gut mit mir Verwenden Sie es
quelle
Zwei Jahre später, und dieses Problem gibt es immer noch ...
In iOS 8 / XCode 6.1 stellte ich manchmal fest, dass sich meine Größe
UILabel
(erstellt in aUITableViewCell
, mit aktiviertem AutoLayout und flexiblen Einschränkungen, sodass genügend Speicherplatz vorhanden ist) nicht an die Textzeichenfolge anpasste.Die Lösung bestand wie in den Vorjahren darin, den Text festzulegen und dann aufzurufen
sizeToFit
.(Seufzer.)
quelle
Gehen Sie wie folgt vor: Angenommen, die folgende NachrichtLabel ist die Bezeichnung, mit der Sie den gewünschten Effekt erzielen möchten. Probieren Sie jetzt diese einfache Codezeile aus:
quelle
funktioniert nicht, wenn
numberOfLines > 1
Was ich getan habe, eine Bedingung wie diese gemacht hat-quelle
Als ich zu spät zur Party kam, aber da ich zusätzlich ein Wort pro Zeile haben musste, hat dieser eine Zusatz den Trick für mich getan:
label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;
Apple Docs sagen:
Aber das ist eine Lüge. Eine Lüge, die ich dir sage! Dies gilt für alle iOS-Versionen. Dies gilt insbesondere für die Verwendung eines
UILabel
innerhalb eines,UICollectionViewCell
für das die Größe durch Einschränkungen bestimmt wird, die zur Laufzeit über ein benutzerdefiniertes Layout dynamisch angepasst werden (z. B.self.menuCollectionViewLayout.itemSize = size
).In Verbindung mit
adjustsFontSizeToFitWidth
undminimumScaleFactor
, wie in den vorherigen Antworten erwähnt,numberOfLines
löste die programmgesteuerte Einstellung basierend auf der Wortanzahl das Problem des automatischen Schrumpfens. Wenn Sie etwas Ähnliches basierend auf der Wortanzahl oder sogar der Zeichenanzahl tun, kann dies zu einer "nah genug" Lösung führen.quelle
In Swift 4 (programmatisch):
quelle
Swift 4, Xcode 9.4.1
Die Lösung, die für mich funktioniert hat: Ich hatte eine Beschriftung in einer Sammlungsansichtszelle und der Beschriftungstext wurde gekürzt. Stellen Sie die Attribute im Storyboard wie folgt ein
quelle