Frage

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?

War es hilfreich?

Lösung

Für iOS 6 und höher, verwenden Sie die folgende mehrere Zeilen 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 unten verwenden Sie die folgende mehrere Zeilen 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 vorwärts ,

im Allgemeinen, tut gerade diese zwei Dinge:

  1. Wählen Sie "Zugeschrieben Text"
  2. auf dem "Zeilenumbruch" Pop-up wählen Sie "Zeilenumbruch"

Andere Tipps

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

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]

Für IOS 6:

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

UILineBreakModeWordWrap and UITextAlignmentCenter

sind in IOS veraltet 6 ab ..

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

button.titleLabel?.numberOfLines = 0

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)

Es gibt einen viel einfacheren Weg:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(Edit für iOS 3 und höher:)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;

links ausrichten auf iOS7 mit automatischem Layout:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

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

Das Problem mit Ihrem Beispiel ist, dass Sie UILabel die numberOfLines Eigenschaft auf etwas anderes als den Standardwert von 1. Sie sollten auch die lineBreakMode Eigenschaft überprüfen.

einstellen müssen

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

 image description hier

Sie müssen Taste Titel Textalignment zum Zentrum setzen

button.titleLabel?.textAlignment = .center

Sie müssen keinen Titeltext mit neuer Zeile (\ n) wie unten,

einstellen

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

Setzen Sie einfach Titel,

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

Hier ist das Ergebnis,

 image description hier

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, werden Sie eine Option für Zeilenumbruch sehen. Wählen Sie Zeilenumbruch, und Sie sollten gut gehen.

Antworten hier sagen Ihnen, wie programmatisch mehrzeilige Schaltfläche Titel 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

Sie haben diesen Code hinzuzufügen:

buttonLabel.titleLabel.numberOfLines = 0;

In Bezug auf Brent Idee, den Titel UILabel als Geschwisteransicht setzt, ist es nicht wie eine sehr gute Idee zu mir scheinen. 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.

habe ich 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 schrieb ein href ein bisschen mehr über diese <= "http://unsolicitedfeedback.com/2009/03/09/how-to-set-a-multi-line-title-in- UIButton“rel = "nofollow noreferrer"> 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.

Wenn Sie Auto-Layout auf iOS 6 verwenden müssen Sie möglicherweise auch die preferredMaxLayoutWidth Eigenschaft festlegen:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;

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>

Einstellung zu NSLineBreakByWordWrapping linebreak (entweder in IB oder Code) Tastenbeschriftung mehrzeilige macht, aber keinen Einfluss auf Taste des Rahmens.

Wird die Taste dynamische Titel hat, gibt es einen Trick: versteckt UILabel mit derselben Schriftart setzen und binden 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.

Wenn Sie Auto-Layout.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2

hatte ich ein Problem mit dem Auto-Layout, nach der Aktivierung von mehreren Leitungen wie dies das Ergebnis war:
„eingeben
so die titleLabel Größe wirkt sich nicht auf die Schaltfläche Größe
Ich habe Constraints hinzugefügt basierend auf contentEdgeInsets (in diesem Fall contentEdgeInsets war (10, 10, 10, 10)
nach dem Aufruf von makeMultiLineSupport():
„eingeben
hoffe, es hilft Ihnen (swift 5.0):

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)
            ])
    }

}

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 dies 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.

Bewegen 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.

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

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)

swift 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)

I aufgenommen jessecurry Antwort innerhalb von STAButton , der Teil meines STAControls Open-Source-Bibliothek. Ich benutze es zur Zeit in einer der Anwendungen Ich entwickle und es funktioniert für meine Bedürfnisse. Fühlen Sie sich frei zu öffnen Fragen auf, wie es zu verbessern oder schicken Sie mir Anfragen ziehen.

Swift 5.0 und Xcode 10.2

SharedClass Beispiel einmal schreiben und jede Ware verwenden

Dies ist die Shared-Klasse (wie dies alle Komponenten Eigenschaften verwenden)

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        
     }
}

Viewcontroller Aufruf wie folgt

button.btnMultipleLines()//This is your button

Auch wenn es okay ist, ein Subview zu einer Kontrolle hinzuzufügen, gibt es keine Garantie, es tatsächlich funktionieren wird, weil die Steuerung nicht erwarten, könnte 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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top