390 Stimmen

Wie fügt man mehrzeiligen Text zu einer UIButton hinzu?

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 ist immer durch das backgroundImage der UIButton verdeckt. Ein Logging-Aufruf, um die Unteransichten der Schaltfläche anzuzeigen, zeigt, dass das UILabel hinzugefügt wurde, aber der Text selbst ist nicht zu sehen. Ist dies ein Fehler in UIButton oder mache ich etwas falsch?

4voto

Varrry Punkte 2488

Das Setzen von lineBreakMode auf NSLineBreakByWordWrapping (entweder in IB oder im Code) macht die Schaltflächenbeschriftung mehrzeilig, hat aber keinen Einfluss auf den Rahmen der Schaltfläche.

Wenn die Schaltfläche einen dynamischen Titel hat, gibt es einen Trick: Legen Sie ein verstecktes UILabel mit derselben Schriftart an und binden Sie dessen Höhe an die Höhe der Schaltfläche mit dem Layout; wenn Sie den Text auf die Schaltfläche und das Label setzen, macht das Autolayout die ganze Arbeit.

Hinweis

Die Höhe der einzeiligen Schaltfläche ist größer als die der Beschriftung. Um zu verhindern, dass die Höhe der Beschriftung schrumpft, muss die vertikale Priorität für die Umarmung des Inhalts größer sein als der vertikale Widerstand für die Komprimierung des Inhalts der Schaltfläche.

4voto

Pablo Blanco Punkte 545

Sie müssen diesen Code hinzufügen:

buttonLabel.titleLabel.numberOfLines = 0;

4voto

Ash Punkte 8661

Heutzutage kann man, wenn man diese Art von Dingen wirklich von Fall zu Fall im Interface Builder zugänglich machen möchte, dies mit einer einfachen Erweiterung wie dieser tun:

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

Dann können Sie numberOfLines einfach als Attribut auf jeden UIButton oder jede UIButton-Unterklasse setzen, als wäre es ein Label. Das Gleiche gilt für eine ganze Reihe anderer Werte, die normalerweise nicht zugänglich sind, wie z. B. der Eckenradius einer Ansichtsebene oder die Attribute des Schattens, den sie wirft.

3voto

vially Punkte 1467

Wenn Sie Auto-Layout unter iOS 6 verwenden, müssen Sie möglicherweise auch die Einstellung preferredMaxLayoutWidth Eigentum:

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

3voto

Naresh Punkte 14268

Unter Swift 5.0 y Xcode 10.2

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

In Ihrem ViewController folgendermaßen aufrufen

button.btnMultipleLines()//This is your button

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X