Ich habe den folgenden Code ...
UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];
... die Idee ist, dass ich mehrzeiligen Text für die Schaltfläche haben kann, aber der Text wird immer durch das Hintergrundbild des UIButton verdeckt. Ein Protokollierungsaufruf zum Anzeigen der Unteransichten der Schaltfläche zeigt an, dass das UILabel hinzugefügt wurde, der Text selbst jedoch nicht angezeigt wird. Ist das ein Fehler in UIButton oder mache ich etwas falsch?
ios
cocoa-touch
uibutton
uikit
Owain Hunt
quelle
quelle
button.titleLabel?.numberOfLines = 0
Antworten:
Verwenden Sie für iOS 6 und höher Folgendes, um mehrere Zeilen zuzulassen:
Verwenden Sie für iOS 5 und niedriger Folgendes, um mehrere Zeilen zuzulassen:
2017 für iOS9 vorwärts ,
Im Allgemeinen machen Sie einfach diese beiden Dinge:
quelle
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
NSLineBreakMode
, wie folgt :button.titleLabel?.lineBreakMode = .ByWordWrapping
.Die ausgewählte Antwort ist korrekt, aber wenn Sie dies in Interface Builder bevorzugen, können Sie Folgendes tun:
quelle
titleLabel.textAlignment
mitNumber
Wert1
inUser Defined Runtime Attributed
den Text zu machen zentriertWenn Sie eine Schaltfläche hinzufügen möchten, deren Titel in mehreren Zeilen zentriert ist, legen Sie die Einstellungen Ihres Interface Builder für die Schaltfläche fest:
[ ]
quelle
Für IOS 6:
Wie
sind ab IOS 6 veraltet.
quelle
NSText.h
derFoundation
gibt es keine veralteten hinzugefügt. Es ist ab 6.0 verfügbar, aber nicht veraltet.button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel?.textAlignment = NSTextAlignment.Center
Um den Vorschlag von Roger Nolan, aber mit explizitem Code, noch einmal zu wiederholen, ist dies die allgemeine Lösung:
quelle
SWIFT 3
quelle
In Xcode 9.3 können Sie dies mithilfe des folgenden Storyboards tun :
Sie müssen den Schaltflächentitel textAlignment auf center setzen
button.titleLabel?.textAlignment = .center
Sie müssen den Titeltext nicht mit einer neuen Zeile (\ n) wie unten festlegen.
button.setTitle("Good\nAnswer",for: .normal)
Einfach Titel setzen,
button.setTitle("Good Answer",for: .normal)
Hier ist das Ergebnis,
quelle
myButton.titleLabel.textAlignment = NSTextAlignmentCenter
Aussage ist auch erforderlich.Es gibt einen viel einfacheren Weg:
(Bearbeiten für iOS 3 und höher :)
quelle
Links auf iOS7 mit Autolayout ausrichten:
quelle
Ich hatte ein Problem mit dem automatischen Layout. Nach dem Aktivieren der Mehrzeiligkeit sah das Ergebnis folgendermaßen aus: Die Größe hat also keinen Einfluss auf die Größe der Schaltflächen, die ich basierend hinzugefügt habe (in diesem Fall war contentEdgeInsets (10, 10, 10, 10) ) nach dem anruf : hoffe es hilft dir (swift 5.0):
titleLabel
Constraints
contentEdgeInsets
makeMultiLineSupport()
quelle
Zunächst sollten Sie sich darüber im Klaren sein, dass UIButton bereits ein UILabel enthält. Sie können es mit einstellen
–setTitle:forState:
.Das Problem mit Ihrem Beispiel ist, dass Sie die
numberOfLines
Eigenschaft von UILabel auf einen anderen Wert als den Standardwert 1 setzen müssen. Sie sollten auch dielineBreakMode
Eigenschaft überprüfen .quelle
Wenn Sie das Storyboard von Xcode 4 verwenden, können Sie auf die Schaltfläche klicken. Im rechten Bereich Dienstprogramme unter Attributinspektor wird eine Option für Zeilenumbruch angezeigt. Wählen Sie Zeilenumbruch, und Sie sollten bereit sein, loszulegen.
quelle
In den Antworten erfahren Sie, wie Sie programmgesteuert einen mehrzeiligen Schaltflächentitel erhalten.
Ich wollte nur hinzufügen, dass Sie bei Verwendung von Storyboards [Strg + Eingabetaste] eingeben können, um eine neue Zeile in einem Schaltflächen-Titelfeld zu erzwingen.
HTH
quelle
Sie müssen diesen Code hinzufügen:
quelle
Was Brents Idee betrifft, den Titel UILabel als Geschwisteransicht zu verwenden, scheint es mir keine sehr gute Idee zu sein. Ich denke immer wieder an Interaktionsprobleme mit dem UILabel, weil seine Berührungsereignisse nicht durch die Sicht des UIButton gelangen.
Andererseits bin ich mit einem UILabel als Unteransicht des UIButton ziemlich bequem zu wissen, dass die Berührungsereignisse immer an die Übersicht des UILabels weitergegeben werden.
Ich habe diesen Ansatz gewählt und keines der mit backgroundImage gemeldeten Probleme bemerkt. Ich habe diesen Code im -titleRectForContentRect: einer UIButton-Unterklasse hinzugefügt, aber der Code kann auch in die Zeichenroutine der UIButton-Übersicht eingefügt werden. In diesem Fall müssen Sie alle Verweise auf self durch die Variable des UIButton ersetzen.
Ich habe die Zeit in Anspruch nehmen und schrieb dies ein bisschen mehr über hier . Dort weise ich auch auf eine kürzere Lösung hin, obwohl sie nicht für alle Szenarien geeignet ist und einige private Ansichten hackt. Dort können Sie auch eine gebrauchsfertige UIButton-Unterklasse herunterladen.
quelle
Wenn Sie unter iOS 6 das automatische Layout verwenden, müssen Sie möglicherweise auch die folgenden
preferredMaxLayoutWidth
Eigenschaften festlegen :quelle
Wenn Sie lineBreakMode auf NSLineBreakByWordWrapping (entweder in IB oder Code) setzen, wird die Tastenbezeichnung mehrzeilig, hat jedoch keinen Einfluss auf den Rahmen der Schaltfläche.
Wenn die Schaltfläche einen dynamischen Titel hat, gibt es einen Trick: Setzen Sie ein verstecktes UILabel mit derselben Schriftart und binden Sie die Höhe mit dem Layout an die Höhe der Schaltfläche. Wenn Sie den Text auf Schaltfläche und Beschriftung setzen und das automatische Layout ausführen, wird die gesamte Arbeit erledigt.
Hinweis
Die intrinsische Größenhöhe der einzeiligen Schaltfläche ist größer als die des Etiketts. Um zu verhindern, dass die Höhe des Etiketts schrumpft, muss die vertikale Inhaltsumarmungspriorität größer sein als die vertikale Inhaltskomprimierungsbeständigkeit der Schaltfläche.
quelle
In Swift 5.0 und Xcode 10.2
Rufen Sie in Ihrem ViewController so auf
quelle
Swift 5, Für mehrzeiligen Text in UIButton
quelle
Es funktioniert perfekt.
Um dies mit einer Konfigurationsdatei wie Plist zu verwenden, müssen Sie CDATA verwenden, um den mehrzeiligen Titel wie folgt zu schreiben:
quelle
Wenn Sie das automatische Layout verwenden.
quelle
schnell 4.0
quelle
Wenn Sie heutzutage wirklich benötigen, dass diese Art von Dingen von Fall zu Fall im Interface Builder verfügbar ist, können Sie dies mit einer einfachen Erweiterung wie der folgenden tun:
Dann können Sie einfach numberOfLines als Attribut für eine beliebige UIButton- oder UIButton-Unterklasse festlegen, als wäre es eine Bezeichnung. Gleiches gilt für eine ganze Reihe anderer normalerweise nicht zugänglicher Werte, z. B. den Eckenradius der Ebene einer Ansicht oder die Attribute des Schatten, den sie wirft.
quelle
Wirf deine eigene Button-Klasse. Es ist bei weitem die beste Lösung auf lange Sicht. UIButton und andere UIKit-Klassen sind sehr restriktiv in der Art und Weise, wie Sie sie anpassen können.
quelle
quelle
Ich habe die Antwort von jessecurry in STAButton aufgenommen, das Teil meiner STAControls Open Source-Bibliothek ist. Ich verwende es derzeit in einer der Apps, die ich entwickle, und es funktioniert für meine Bedürfnisse. Sie können gerne Fragen zur Verbesserung stellen oder mir Pull-Anfragen senden.
quelle
Um den Abstand der Titelbezeichnung zur Schaltfläche festzulegen, legen Sie titleEdgeInsets und andere Eigenschaften vor setTitle fest:
PS Ich habe getestet, dass die Einstellung titleLabel? .TextAlignment nicht erforderlich ist und der Titel ausgerichtet ist
.natural
.quelle
Obwohl es in Ordnung ist, einem Steuerelement eine Unteransicht hinzuzufügen, gibt es keine Garantie dafür, dass es tatsächlich funktioniert, da das Steuerelement möglicherweise nicht erwartet, dass es dort vorhanden ist, und sich daher möglicherweise schlecht verhält. Wenn Sie damit durchkommen können, fügen Sie einfach das Etikett als Geschwisteransicht der Schaltfläche hinzu und stellen Sie den Rahmen so ein, dass er die Schaltfläche überlappt. Solange es so eingestellt ist, dass es über der Schaltfläche angezeigt wird, wird es durch nichts, was die Schaltfläche tun kann, verdeckt.
Mit anderen Worten:
quelle
addSubview:
Hier wird es zurbutton
Übersicht hinzugefügt, wodurch es zu einem Geschwister der Schaltfläche wird, sodass die Übereinstimmung ihrer Zentren korrekt ist.