Cum vă adăugați text multi-line la un UIButton?

voturi
313

Am următorul cod ...

UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @Long text string;
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];

... ideea fiind că eu pot avea textul multi-line pentru buton, dar textul este întotdeauna mascat de backgroundImage a UIButton. Un apel de logare pentru a arăta subviews butonului arată că UILabel a fost adăugat, dar textul în sine nu poate fi văzut. Este aceasta o problemă în UIButton sau fac ceva greșit?

Întrebat 03/03/2009 la 01:22
sursa de către utilizator
În alte limbi...                            


26 răspunsuri

voturi
618

Pentru iOS 6 și mai sus, utilizați următoarele pentru a permite mai multe linii:

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

Pentru iOS 5 și mai jos utilizare următoarele pentru a permite mai multe linii:

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

2017, pentru iOS9 înainte ,

în general, nu doar aceste două lucruri:

  1. selectați „Text Atribuit“
  2. pe „Linia Break“ pop - up selectați „Word Wrap“
Publicat 01/12/2009 la 23:34
sursa de către utilizator

voturi
114

Răspunsul selectat este corect, dar dacă preferați să faceți acest tip de lucru în Interface Builder puteți face acest lucru:

pic

Publicat 14/05/2014 la 16:36
sursa de către utilizator

voturi
53

Pentru IOS 6:

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

La fel de

UILineBreakModeWordWrap and UITextAlignmentCenter

sunt depreciate în IOS 6 începând ..

Publicat 08/10/2012 la 08:14
sursa de către utilizator

voturi
41

Dacă doriți să adăugați un buton cu titlul centrat cu mai multe linii, setați setările interfeței Builder lui pentru butonul:

[ aici]

Publicat 21/10/2015 la 09:03
sursa de către utilizator

voturi
28

Pentru a reformula sugestia lui Roger Nolan, dar cu cod explicit, aceasta este soluția generală:

button.titleLabel?.numberOfLines = 0
Publicat 28/10/2010 la 16:45
sursa de către utilizator

voturi
17

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Publicat 08/05/2017 la 09:56
sursa de către utilizator

voturi
10

Există o modalitate mult mai simplă:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(Editare pentru iOS 3 și mai târziu :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Publicat 25/10/2009 la 20:48
sursa de către utilizator

voturi
9

Aliniați la stânga pe iOS7 cu autolayout:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Publicat 28/06/2013 la 20:07
sursa de către utilizator

voturi
7

În primul rând, ar trebui să fie conștienți de faptul că UIButton are deja un UILabel în interiorul acestuia. Îl puteți seta folosind –setTitle:forState:.

Problema cu dvs. de exemplu , este că aveți nevoie pentru a seta UILabel de numberOfLinesproprietate altceva decât valoarea implicită 1. Trebuie să examinați , de asemenea, lineBreakModeproprietatea.

Publicat 03/03/2009 la 09:35
sursa de către utilizator

voturi
4

Răspunsuri aici vă spun cum să realizeze multilinie din titlu butonul programatică.

Am vrut doar să adaug că, dacă utilizați storyboard-uri, puteți tasta [Ctrl + Enter] pentru a forța o linie nouă pe un câmp din titlu buton.

HTH

Publicat 01/05/2013 la 10:50
sursa de către utilizator

voturi
4

Pentru cei care folosesc storyboard Xcode 4, aveți posibilitatea să faceți clic pe butonul, iar pe partea dreaptă Utilități panoul de sub Atribute inspector, veți vedea o opțiune pentru linie Break. Alegeți Word Wrap, și ar trebui să fie bun pentru a merge.

Publicat 09/05/2012 la 19:12
sursa de către utilizator

voturi
3

În ceea ce privește ideea lui Brent de a pune UILabel din titlu ca vedere frate, nu mi se pare o idee foarte bună. Mă tot gândesc la probleme de interacțiune cu UILabel din cauza evenimentelor sale de atingere nu obtinerea prin punctul de vedere al lui UIButton.

Pe de altă parte, cu un UILabel ca subview a UIButton, sunt destul de confortabil știind că evenimentele de atingere vor fi întotdeauna propagate la Superview UILabel lui.

Am luat această abordare și nu a observat nici una dintre problemele raportate cu backgroundImage. Am adăugat acest cod în -titleRectForContentRect: a unei subclase UIButton dar codul poate fi, de asemenea, plasate în desen de rutină a SuperView UIButton, care, în acest caz, veți înlocui toate referirile la sine cu variabila UIButton lui.

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

Am făcut -o ia timp și a scris un pic mai mult despre asta aici . Acolo, am punctul de asemenea , o soluție mai scurtă, deși nu se potrivește destul de toate scenariile și implică unele puncte de vedere particulare de hacking. De asemenea , acolo, puteți descărca o subclasa UIButton gata pentru a fi utilizate.

Publicat 09/03/2009 la 15:25
sursa de către utilizator

voturi
2

Trebuie să adăugați acest cod:

buttonLabel.titleLabel.numberOfLines = 0;
Publicat 21/02/2018 la 11:41
sursa de către utilizator

voturi
2

Dacă utilizați auto-aspect.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2
Publicat 09/12/2016 la 10:55
sursa de către utilizator

voturi
2

Setarea lineBreakMode la NSLineBreakByWordWrapping (fie în IB sau cod) face ca eticheta butonului multilinie, dar nu afectează cadru buton.

Dacă buton are titlu dinamic, există un truc: pune UILabel ascunse cu același font și cravată este înălțimea la înălțimea butonului cu aspect; când este setat text la buton și eticheta și autolayout va face toate lucrările.

Notă

Înălțimea dimensiunea intrinseca a butonului o singură linie este mai mare decât eticheta, astfel încât pentru a preveni inaltimea Etichetei micsora este verticală îmbrățișarea prioritară Conținutul trebuie să fie mai mare decât conținutul vertical buton, rezistenta la compresiune.

Publicat 31/08/2015 la 20:21
sursa de către utilizator

voturi
2

Dacă utilizați auto-aspect pe iOS 6 poate fi necesar , de asemenea , să setați preferredMaxLayoutWidthproprietatea:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
Publicat 01/05/2013 la 19:45
sursa de către utilizator

voturi
2

Functioneaza perfect.

Adăugați pentru a utiliza acest lucru cu fișier de configurare cum ar fi Plist, trebuie să utilizați CDATA pentru a scrie titlul multilined, ca aceasta:

<string><![CDATA[Line1
Line2]]></string>
Publicat 11/05/2011 la 11:04
sursa de către utilizator

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

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
Publicat 03/08/2017 la 09:40
sursa de către utilizator

voturi
0

În Swift 5.0 și Xcode 10.2

SharedClass exemplu a scrie o dată și de a folosi orice obiecte

Aceasta este clasa care este permis accesul (ca aceasta să utilizați toate componentele proprietăți)

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

În dvs. ViewController apel ca aceasta

button.btnMultipleLines()//This is your button
Publicat 29/04/2019 la 07:54
sursa de către utilizator

voturi
0

Am avut o problema cu auto-aspect, după activarea multi-line rezultatul a fost ca acest lucru: astfel încât dimensiunea nu afectează dimensiunea butonului am adăugat pe baza (în acest caz a fost contentEdgeInsets (10, 10, 10, 10 ) după apel : sper că vă (5.0 rapidă de ajutor):
introduceți descrierea imaginii aici
titleLabel
ConstraintscontentEdgeInsets
makeMultiLineSupport()
introduceți descrierea imaginii aici

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

}
Publicat 11/04/2019 la 21:25
sursa de către utilizator

voturi
0

Aceste zile, în cazul în care aveți nevoie într-adevăr acest tip de lucru să fie accesibile în constructor de interfață de la caz la caz, o poti face cu o simplă extensie de genul:

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

Apoi, puteți seta pur și simplu numberOfLines ca un atribut cu privire la orice UIButton sau UIButton subclasă ca și cum ar fi o etichetă. Același lucru este valabil și pentru o întreagă serie de alte valori, de obicei, inaccesibile, cum ar fi raza de colț a stratului de vedere, ori atributele umbra pe care le aruncă.

Publicat 17/11/2018 la 07:12
sursa de către utilizator

voturi
0

În Xcode 9.3 puteți face acest lucru prin utilizarea storyboard ca mai jos,

introduceți descrierea imaginii aici

Trebuie să setați butonul din titlu textAlignment pana in centru

button.titleLabel?.textAlignment = .center

Nu aveți nevoie pentru a seta textul din titlu cu noua linie (\ n) ca mai jos,

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

Pur și simplu set din titlu,

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

Aici este rezultatul,

introduceți descrierea imaginii aici

Publicat 31/05/2018 la 06:14
sursa de către utilizator

voturi
0

Am inclus răspunsul jessecurry lui în cadrul STAButton , care face parte din meu STAControls biblioteca open source. Eu în prezent , îl folosesc într - una dintre aplicațiile Sunt în curs de dezvoltare și funcționează pentru nevoile mele. Simțiți - vă liber pentru a deschide probleme cu privire la modul de a îmbunătăți sau trimite - mi trage cereri.

Publicat 05/05/2018 la 23:27
sursa de către utilizator

voturi
0

rapidă 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)
Publicat 25/03/2018 la 12:50
sursa de către utilizator

voturi
0

Rulati propria clasă buton. Este de departe cea mai bună soluție pe termen lung. UIButton și alte clase UIKit sunt foarte restrictive în modul în care le puteți personaliza.

Publicat 10/03/2009 la 14:16
sursa de către utilizator

voturi
-3

Deși este bine să adăugați un subview la un control, nu există nici o garanție că va funcționa de fapt, deoarece controlul ar putea să nu se așteaptă ca acesta să fie acolo și, astfel, s-ar putea să se comporte prost. Dacă puteți obține departe cu ea, trebuie doar să adăugați eticheta ca vedere frate a butonului și a stabilit cadrul său, astfel încât să se suprapună pe butonul; atâta timp cât este setat să apară în partea de sus a butonului, butonul poate face nimic va ascunde.

Cu alte cuvinte:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
Publicat 03/03/2009 la 13:04
sursa de către utilizator

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