Wie Sie mehrzeiligen Text in einem UIButton hinzufügen?

stimmen
313

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 immer durch den background des UIButton verdeckt wird. Ein Protokollierung Aufruf die Subviews der Taste zu zeigen, zeigt, dass der UILabel hinzugefügt wurde, aber der Text selbst nicht gesehen werden kann. Ist das ein Fehler in UIButton oder mache ich etwas falsch gemacht?

Veröffentlicht am 03/03/2009 um 01:22
quelle vom benutzer
In anderen Sprachen...                            


26 antworten

stimmen
618

Für iOS 6 und höher, verwenden Sie die folgende mehrere Zeilen zu ermöglichen:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
// you probably want to center it
button.titleLabel.textAlignment = NSTextAlignmentCenter; // if you want to 
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

Für iOS 5 und unter Verwendung der folgenden auf mehrere Leitungen zu ermöglichen:

button.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
// you probably want to center it
button.titleLabel.textAlignment = UITextAlignmentCenter;
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

2017 für iOS9 nach vorn ,

im Allgemeinen, tun gerade diese zwei Dinge:

  1. wählen „Zugeschrieben Text“
  2. auf dem „Zeilenumbruch“ Pop - up wählen Sie „Zeilenumbruch“
Beantwortet am 01/12/2009 um 23:34
quelle vom benutzer

stimmen
114

Die gewählte Antwort ist richtig, aber wenn Sie es vorziehen, diese Art der Sache im Interface Builder, dies zu tun Sie tun können:

pic

Beantwortet am 14/05/2014 um 16:36
quelle vom benutzer

stimmen
53

Für IOS 6:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;

Wie

UILineBreakModeWordWrap and UITextAlignmentCenter

sind in IOS 6 ab veraltet ..

Beantwortet am 08/10/2012 um 08:14
quelle vom benutzer

stimmen
41

Wenn Sie auf eine Schaltfläche mit dem Titel mit mehreren Linien zentriert hinzufügen möchten, stellen Sie Ihren Interface Builder Einstellungen für die Schaltfläche:

[ Hier]

Beantwortet am 21/10/2015 um 09:03
quelle vom benutzer

stimmen
28

Roger Nolan Vorschlag, aber mit explizitem Code neu zu formulieren, ist dies die allgemeine Lösung:

button.titleLabel?.numberOfLines = 0
Beantwortet am 28/10/2010 um 16:45
quelle vom benutzer

stimmen
17

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Beantwortet am 08/05/2017 um 09:56
quelle vom benutzer

stimmen
10

Es gibt eine viel einfachere Art und Weise:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(Edit für iOS 3 und später :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Beantwortet am 25/10/2009 um 20:48
quelle vom benutzer

stimmen
9

Linksbündig ausrichten auf iOS7 mit automatischem Layout:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Beantwortet am 28/06/2013 um 20:07
quelle vom benutzer

stimmen
7

Zunächst einmal sollten Sie sich bewusst sein , dass UIButton bereits eine UILabel im Inneren hat. Sie können es verwenden eingestellt –setTitle:forState:.

Das Problem mit Ihrem Beispiel ist , dass Sie festlegen müssen UILabel die numberOfLinesEigenschaft auf etwas anderes als den Standardwert von 1. Sie sollen auch die Bewertung lineBreakModeEigenschaft.

Beantwortet am 03/03/2009 um 09:35
quelle vom benutzer

stimmen
4

Antworten hier sagen Ihnen, wie mehrzeilige Schaltfläche Titel programmatisch zu erreichen.

Ich wollte nur hinzufügen, dass, wenn Sie Storyboards verwenden, können Sie eingeben [Strg + Enter] eine neue Zeile auf eine Schaltfläche Titelfeld zu erzwingen.

HTH

Beantwortet am 01/05/2013 um 10:50
quelle vom benutzer

stimmen
4

Für diejenigen, die Xcode 4 Storyboard verwenden, können Sie auf die Schaltfläche klicken, und auf der rechten Seite unter Dienstprogramme Bereich Attribute Inspector, erhalten Sie eine Option für Zeilenumbruch sehen. Wählen Sie Zeilenumbruch, und Sie sollten gut zu gehen.

Beantwortet am 09/05/2012 um 19:12
quelle vom benutzer

stimmen
3

In Bezug auf Brent Idee, den Titel UILabel als Geschwister Ansicht setzen, es scheint wie eine sehr gute Idee, mir nicht. Ich halte mit der UILabel in Interaktion Probleme denken aufgrund seiner Touch-Ereignisse nicht durch die Ansicht der UIButton bekommen.

Auf der anderen Seite, mit einem UILabel als Subview des UIButton, sie ist ziemlich komfortabel zu wissen, dass die Touch-Ereignisse werden immer an den Super des UILabel vermehrt werden.

Ich habe diesen Ansatz und hat keine der Probleme mit Background berichtet bemerken. Ich habe diesen Code in dem -titleRectForContentRect: eine UIButton Unterklasse aber der Code kann auch in Zeichenroutine des UIButton Superview platziert werden, die in diesem Fall, dass Sie alle Verweise auf mich selbst mit dem UIButton der Variable ersetzen sollen.

#define TITLE_LABEL_TAG 1234

- (CGRect)titleRectForContentRect:(CGRect)rect
{   
    // define the desired title inset margins based on the whole rect and its padding
    UIEdgeInsets padding = [self titleEdgeInsets];
    CGRect titleRect = CGRectMake(rect.origin.x    + padding.left, 
                                  rect.origin.x    + padding.top, 
                                  rect.size.width  - (padding.right + padding.left), 
                                  rect.size.height - (padding.bottom + padding].top));

    // save the current title view appearance
    NSString *title = [self currentTitle];
    UIColor  *titleColor = [self currentTitleColor];
    UIColor  *titleShadowColor = [self currentTitleShadowColor];

    // we only want to add our custom label once; only 1st pass shall return nil
    UILabel  *titleLabel = (UILabel*)[self viewWithTag:TITLE_LABEL_TAG];


    if (!titleLabel) 
    {
        // no custom label found (1st pass), we will be creating & adding it as subview
        titleLabel = [[UILabel alloc] initWithFrame:titleRect];
        [titleLabel setTag:TITLE_LABEL_TAG];

        // make it multi-line
        [titleLabel setNumberOfLines:0];
        [titleLabel setLineBreakMode:UILineBreakModeWordWrap];

        // title appearance setup; be at will to modify
        [titleLabel setBackgroundColor:[UIColor clearColor]];
        [titleLabel setFont:[self font]];
        [titleLabel setShadowOffset:CGSizeMake(0, 1)];
        [titleLabel setTextAlignment:UITextAlignmentCenter];

        [self addSubview:titleLabel];
        [titleLabel release];
    }

    // finally, put our label in original title view's state
    [titleLabel setText:title];
    [titleLabel setTextColor:titleColor];
    [titleLabel setShadowColor:titleShadowColor];

    // and return empty rect so that the original title view is hidden
    return CGRectZero;
}

Ich habe die Zeit in Anspruch nehmen und ein bisschen mehr darüber schrieb hier . Dort habe ich auch eine kürzere Lösung zeigen, obwohl es durchaus nicht alle Szenarien passen und beinhaltet einige Vernissagen Hacking. Auch dort können Sie eine UIButton Unterklasse bereit , um verwendet werden.

Beantwortet am 09/03/2009 um 15:25
quelle vom benutzer

stimmen
2

Sie haben diesen Code hinzuzufügen:

buttonLabel.titleLabel.numberOfLines = 0;
Beantwortet am 21/02/2018 um 11:41
quelle vom benutzer

stimmen
2

Wenn Sie Auto-Layout.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2
Beantwortet am 09/12/2016 um 10:55
quelle vom benutzer

stimmen
2

Einstellen auf NSLineBreakByWordWrapping linebreak (entweder in IB oder Code) macht Button-Beschriftung mehrzeilige, wird aber nicht Schaltfläche Rahmen beeinflussen.

Wenn Knopf dynamischen Titel hat, gibt es einen Trick: versteckt UILabel mit derselben Schriftart setzen und bindet es Höhe Taste Höhe mit Layout; wenn gesetzt Text auf Button und Label und automatisches Layout wird die ganze Arbeit machen.

Hinweis

Intrinsic Größe Höhe von einzeiliger Taste ist größer als Etikett, so Etikettenhöhe zu verhindern schrumpft es vertikal Inhalt Hugging Priorität größer sein muss als vertikaler Content Compression Resistance der Taste.

Beantwortet am 31/08/2015 um 20:21
quelle vom benutzer

stimmen
2

Wenn Sie Auto-Layout auf 6 iOS verwenden könnten Sie auch die festlegen müssen preferredMaxLayoutWidthEigenschaft:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
Beantwortet am 01/05/2013 um 19:45
quelle vom benutzer

stimmen
2

Es funktioniert perfekt.

Fügen Sie diese wie Plist mit Config-Datei zu verwenden, müssen Sie CDATA verwenden, um die mehrzeilige Titel zu schreiben, wie folgt aus:

<string><![CDATA[Line1
Line2]]></string>
Beantwortet am 11/05/2011 um 11:04
quelle vom benutzer

stimmen
1
self.btnError.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
Beantwortet am 03/08/2017 um 09:40
quelle vom benutzer

stimmen
0

In Swift 5.0 und Xcode 10.2

SharedClass Beispiel einmal schreiben und jede Ware verwenden

Dies ist der Shared-Klasse (wie diese Sie verwenden, um alle Komponenten Eigenschaften)

import UIKit

class SharedClass: NSObject {

     static let sharedInstance = SharedClass()

     private override init() {

     }
  }

//UIButton extension
extension UIButton {
     //UIButton properties
     func btnMultipleLines() {
         titleLabel?.numberOfLines = 0
         titleLabel?.lineBreakMode = .byWordWrapping
         titleLabel?.textAlignment = .center        
     }
}

In Ihrem Viewcontroller Aufruf wie folgt

button.btnMultipleLines()//This is your button
Beantwortet am 29/04/2019 um 07:54
quelle vom benutzer

stimmen
0

Ich hatte ein Problem mit dem Auto-Layout, nach der Aktivierung des Ergebnis mehrzeiligen wie das war: so die Größe wirkt sich nicht auf die Schaltfläche Größe habe ich hinzugefügt , auf der Grundlage (in diesem Fall contentEdgeInsets war (10, 10, 10, 10 ) nach dem Aufruf : hoffen , dass es Ihnen (swift 5.0) helfen:
Geben Sie hier image description
titleLabel
ConstraintscontentEdgeInsets
makeMultiLineSupport()
Geben Sie hier image description

extension UIButton {

    func makeMultiLineSupport() {
        guard let titleLabel = titleLabel else {
            return
        }
        titleLabel.numberOfLines = 0
        titleLabel.setContentHuggingPriority(.required, for: .vertical)
        titleLabel.setContentHuggingPriority(.required, for: .horizontal)
        addConstraints([
            .init(item: titleLabel,
                  attribute: .top,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .top,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.top),
            .init(item: titleLabel,
                  attribute: .bottom,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .bottom,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.bottom),
            .init(item: titleLabel,
                  attribute: .left,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .left,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.left),
            .init(item: titleLabel,
                  attribute: .right,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .right,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.right)
            ])
    }

}
Beantwortet am 11/04/2019 um 21:25
quelle vom benutzer

stimmen
0

In diesen Tagen, wenn Sie wirklich diese Art der Sache müssen in Interface Builder auf einer Fall-zu-Fall-Basis zugänglich sein, können Sie es mit einer einfachen Erweiterung wie folgt tun:

extension UIButton {
    @IBInspectable var numberOfLines: Int {
        get { return titleLabel?.numberOfLines ?? 1 }
        set { titleLabel?.numberOfLines = newValue }
    }
}

Dann können Sie einfach NumberOfLines als Attribut auf jedem UIButton oder UIButton Unterklasse festgelegt, als ob es ein Label waren. Das gleiche gilt für eine ganze Reihe von anderen in der Regel nicht zugänglichen Werte, wie der Eckenradius einer Schicht aus Sicht oder die Attribute des Schattens, die es wirft.

Beantwortet am 17/11/2018 um 07:12
quelle vom benutzer

stimmen
0

In Xcode 9.3 können Sie es tun , indem Sie Storyboard wie unten,

Geben Sie hier image description

Sie müssen Schaltfläche Titel Textalignment auf Zentrieren

button.titleLabel?.textAlignment = .center

Sie brauchen nicht Titeltext mit neuer Zeile (\ n) wie unten zu setzen,

button.setTitle("Good\nAnswer",for: .normal)

Setzen Sie einfach Titel,

button.setTitle("Good Answer",for: .normal)

Hier ist das Ergebnis,

Geben Sie hier image description

Beantwortet am 31/05/2018 um 06:14
quelle vom benutzer

stimmen
0

Ich enthalten jessecurry Antwort innerhalb STAButton , der Teil meiner ist STAControls Open - Source - Bibliothek. Ich benutze es zur Zeit in einer der Anwendungen Ich entwickle und es funktioniert für meine Bedürfnisse. Sie können ferner Probleme auf öffnen , wie es zu verbessern oder mich Anfragen ziehen senden.

Beantwortet am 05/05/2018 um 23:27
quelle vom benutzer

stimmen
0

swift 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)
Beantwortet am 25/03/2018 um 12:50
quelle vom benutzer

stimmen
0

Rollen Sie Ihre eigene Taste Klasse. Es ist bei weitem die beste Lösung auf lange Sicht. UIButton und andere UIKit Klassen sind sehr restriktiv, wie Sie sie anpassen können.

Beantwortet am 10/03/2009 um 14:16
quelle vom benutzer

stimmen
-3

Obwohl es in Ordnung ist ein Subview zu einer Kontrolle hinzuzufügen, gibt es keine Garantie, es tatsächlich funktionieren werden, da die Steuerung erwartet nicht, dass es dort zu sein und könnte so schlecht verhalten. Wenn Sie mit ihm weg erhalten können, fügen Sie einfach das Etikett als Geschwister Ansicht des Knopfes und der Rahmen so eingestellt, dass sie auf die Schaltfläche überlappt; solange es oben auf der Schaltfläche angezeigt eingestellt ist, nichts auf die Schaltfläche tun kann, wird es verschleiern.

Mit anderen Worten:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
Beantwortet am 03/03/2009 um 13:04
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more