Ich habe eine UILabel
, die unterschiedlich lang sein kann, je nachdem, ob meine App auf einem iPhone oder iPad im Hoch- oder Querformat ausgeführt wird. Wenn der Text zu lang ist, um in einer Zeile angezeigt zu werden, und abgeschnitten wird, möchte ich, dass der Benutzer ihn drücken und ein Popup des vollständigen Textes erhalten kann.
Wie kann ich überprüfen, ob UILabel
der Text abgeschnitten wird? Ist es überhaupt möglich? Im Moment suche ich nur nach verschiedenen Längen, je nachdem in welchem Modus ich mich befinde, aber es funktioniert nicht besonders gut.
UILabel
API integriert hat.Antworten:
Sie können die Breite der Zeichenfolge berechnen und feststellen, ob die Breite größer als ist
label.bounds.size.width
NSString UIKit Additions bietet verschiedene Methoden zum Berechnen der Größe der Zeichenfolge mit einer bestimmten Schriftart. Wenn Sie jedoch eine minimale Schriftgröße für Ihr Etikett haben, mit der das System den Text auf diese Größe verkleinern kann. In diesem Fall möchten Sie möglicherweise sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode: verwenden .
quelle
numberOfLines
gibt die maximale Anzahl von Zeilen zurück, die zum Anzeigen des Textes verwendet werden, wie in derUILabel
Klassenreferenz beschrieben: developer.apple.com/library/ios/documentation/UIKit/Reference/…Swift (als Erweiterung) - funktioniert für mehrzeiliges Uilabel:
swift4: (
attributes
ParameterboundingRect
leicht geändert)swift3:
swift2:
quelle
EDIT: Ich habe gerade gesehen, dass meine Antwort positiv bewertet wurde, aber das von mir angegebene Code-Snippet ist veraltet.
Der beste Weg, dies zu tun, ist (ARC):
Beachten Sie, dass die berechnete Größe kein ganzzahliger Wert ist. Wenn Sie also Dinge wie tun
int height = rect.size.height
, verlieren Sie etwas Gleitkommapräzision und haben möglicherweise falsche Ergebnisse.Alte Antwort (veraltet):
Wenn Ihr Etikett mehrzeilig ist, können Sie diesen Code verwenden:
quelle
Sie können mit UILabel eine Kategorie erstellen
quelle
textRectForBounds:limitedToNumberOfLines:
"Sie sollten diese Methode nicht direkt aufrufen" ...setNeedsLayout()
layoutIfNeeded()
am Anfang der Methode.Verwenden Sie diese Kategorie, um festzustellen, ob ein Label unter iOS 7 und höher abgeschnitten ist.
quelle
Swift 3
Sie können die Anzahl der Zeilen nach dem Zuweisen der Zeichenfolge zählen und mit der maximalen Anzahl der Zeilen des Etiketts vergleichen.
quelle
Um die Antwort von iDev zu ergänzen , sollten Sie
intrinsicContentSize
stattdessen verwendenframe
, damit es für Autolayout funktioniertquelle
Das ist es. Dies funktioniert mit
attributedText
, bevortext
wir auf die Ebene zurückgreifen , was für uns Leute, die sich mit mehreren Schriftfamilien, -größen und sogar NSTextAttachments befassen, sehr sinnvoll ist!Funktioniert gut mit Autolayout, aber offensichtlich müssen die Einschränkungen definiert und festgelegt werden, bevor wir sie überprüfen
isTruncated
. Andernfalls weiß das Etikett selbst nicht einmal, wie es sich selbst anordnen soll, sodass es auf keinen Fall wissen würde, ob es abgeschnitten ist.Es funktioniert nicht, dieses Problem nur mit einem einfachen
NSString
und zu lösensizeThatFits
. Ich bin mir nicht sicher, wie die Leute so positive Ergebnisse erzielt haben. Übrigens, wie bereits mehrfach erwähnt, ist die Verwendung überhauptsizeThatFits
nicht ideal, da sienumberOfLines
die resultierende Größe berücksichtigt , die den gesamten Zweck unseres Versuchs zunichte macht, daisTruncated
sie immer zurückkehren würde,false
unabhängig davon, ob sie abgeschnitten ist oder nicht.quelle
Hier ist die ausgewählte Antwort in Swift 3 (als Erweiterung). Das OP fragte nach 1-Zeilen-Beschriftungen. Viele der schnellen Antworten, die ich hier ausprobiert habe, beziehen sich speziell auf mehrzeilige Beschriftungen und werden auf einzeiligen Beschriftungen nicht korrekt gekennzeichnet.
quelle
Dies funktioniert für iOS 8:
quelle
Ich habe eine Kategorie für die Arbeit mit UILabels Kürzung geschrieben. Funktioniert unter iOS 7 und höher. Ich hoffe es hilft ! uilabel Schwanzkürzung
quelle
Sie können die Breite der Zeichenfolge berechnen und feststellen, ob die Breite größer als die Beschriftungsbreite ist.
quelle
Um zu dem hinzuzufügen, was @iDev getan hat, habe ich das
self.frame.size.height
zu verwenden geändertlabel.frame.size.height
und auch nicht verwendetNSStringDrawingUsesLineFontLeading
. Nach diesen Änderungen konnte ich perfekt berechnen, wann die Kürzung erfolgen würde (zumindest für meinen Fall).quelle
Ich hatte Probleme mit der
boundingRect(with:options:attributes:context:)
Verwendung von Autolayout (um eine maximale Höhe festzulegen) und einem zugeordneten Text mitNSParagraph.lineSpacing
Der Abstand zwischen den Zeilen wurde ignoriert (auch wenn er an
attributes
dieboundingRect
Methode übergeben wurde), sodass die Beschriftung möglicherweise als nicht abgeschnitten betrachtet wird, wenn sie vorhanden war.Die Lösung, die ich gefunden habe, ist zu verwenden
UIView.sizeThatFits
:quelle
Da alle oben genannten Antworten veraltete Methoden verwenden, hielt ich dies für nützlich:
quelle
Um mit iOS 6 fertig zu werden (ja, einige von uns müssen es noch), gibt es noch eine weitere Erweiterung der Antwort von @ iDev. Der Schlüssel zum Erfolg ist, dass Sie für iOS 6 sicherstellen müssen, dass die numberOfLines Ihres UILabels auf 0 gesetzt ist, bevor Sie sizeThatFits aufrufen. Wenn nicht, erhalten Sie ein Ergebnis, das besagt, dass "die Punkte zum Zeichnen von numberOfLines im Wert der Höhe" zum Zeichnen des Beschriftungstextes erforderlich sind.
quelle
Stellen Sie sicher, dass Sie eine dieser Optionen in viewDidLayoutSubviews aufrufen.
quelle
SWIFT 5
Beispiel für ein mehrzeiliges UILabel, das nur 3 Zeilen anzeigt.
Obwohl der Benutzer die Eingabetaste auswählen kann, um eine zusätzliche Zeile hinzuzufügen, ohne die "Textbreite" zu erhöhen, kann in diesem Fall auch so etwas nützlich sein.
quelle
Swift 3-Lösung
Ich denke, die beste Lösung besteht darin, (1) ein
UILabel
mit den gleichen Eigenschaften wie das Etikett zu erstellen, das Sie auf Kürzung prüfen, (2) aufzurufen.sizeToFit()
, (3) die Attribute des Dummy-Etiketts mit Ihrem tatsächlichen Etikett zu vergleichen.Wenn Sie beispielsweise überprüfen möchten, ob ein einzeiliges Etikett mit unterschiedlicher Breite abgeschnitten ist oder nicht, können Sie diese Erweiterung verwenden:
... aber auch hier können Sie den obigen Code leicht an Ihre Bedürfnisse anpassen. Nehmen wir also an, Ihr Etikett ist mehrzeilig und hat eine unterschiedliche Höhe. Dann würde die Erweiterung ungefähr so aussehen:
quelle
Wäre es nicht einfach, das title-Attribut für die Beschriftung festzulegen? Wenn Sie dies festlegen, wird beim Bewegen des Mauszeigers die vollständige Beschriftung angezeigt.
Sie können die Länge des Etiketts und die Div-Breite berechnen (in Länge konvertieren - jQuery / Javascript - Wie konvertiere ich einen Pixelwert (20px) in einen Zahlenwert (20) ).
Setzen Sie jquery, um den Titel festzulegen, wenn die Länge größer als die div-Breite ist.
quelle