Hvordan legger du flere linjer tekst til en UIButton?

stemmer
322

Jeg har følgende kode ...

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

... tanken er at jeg kan ha flere linjer tekst for knapp, men teksten er alltid skjult av backgroundImage av UIButton. En logging samtale for å vise subviews på knappen viser at UILabel har blitt lagt til, men selve teksten kan ikke ses. Er dette en feil i UIButton eller gjør jeg noe galt?

Publisert på 03/03/2009 klokken 00:22
kilden bruker
På andre språk...                            


26 svar

stemmer
629

For iOS 6 og over, brukes følgende for å tillate flere linjer:

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

For iOS 5 og under anvendelse av følgende for å tillate flere linjer:

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

2017, for iOS9 fremover ,

generelt, bare gjør disse to tingene:

  1. velge "tilskrevet tekst"
  2. på "Line Break" popup velg "Word Wrap"
Svarte 01/12/2009 kl. 22:34
kilden bruker

stemmer
118

Den valgte svaret er riktig, men hvis du foretrekker å gjøre denne typen ting i Interface Builder kan du gjøre dette:

pic

Svarte 14/05/2014 kl. 15:36
kilden bruker

stemmer
53

For IOS 6:

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

Som

UILineBreakModeWordWrap and UITextAlignmentCenter

avløses og IOS 6 og utover ..

Svarte 08/10/2012 kl. 07:14
kilden bruker

stemmer
47

Hvis du vil legge til en knapp med tittelen sentrert med flere linjer, angi Interface Builder innstillinger for knapp:

[ her]

Svarte 21/10/2015 kl. 09:03
kilden bruker

stemmer
29

Å omarbeide Roger Nolan forslag, men med eksplisitt kode, er dette den generelle løsningen:

button.titleLabel?.numberOfLines = 0
Svarte 28/10/2010 kl. 15:45
kilden bruker

stemmer
17

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Svarte 08/05/2017 kl. 09:56
kilden bruker

stemmer
10

Venstre justere på iOS 7 med Autooppsett:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Svarte 28/06/2013 kl. 19:07
kilden bruker

stemmer
10

Det er en mye enklere måte:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(Edit for iOS 3 og senere :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Svarte 25/10/2009 kl. 19:48
kilden bruker

stemmer
7

Først av alt, bør du være oppmerksom på at UIButton har allerede en UILabel inni den. Du kan sette den hjelp –setTitle:forState:.

Problemet med ditt eksempel er at du må sette UILabel sin numberOfLineseiendom til noe annet enn standardverdien 1. Du bør også lineBreakModeeiendom.

Svarte 03/03/2009 kl. 08:35
kilden bruker

stemmer
4

Svarene her fortelle deg hvordan du kan oppnå flere linjer knappen tittel programmatisk.

Jeg ville bare legge til at hvis du bruker storyboards, kan du skrive [Ctrl + Enter] for å tvinge en ny linje på en knapp tittelfelt.

HTH

Svarte 01/05/2013 kl. 09:50
kilden bruker

stemmer
4

For de som bruker Xcode 4 sin storyboard, kan du klikke på knappen, og på høyre side Utilities rute under attributter Inspector, vil du se et alternativ for linjeskift. Velg Word Wrap, og du bør være godt å gå.

Svarte 09/05/2012 kl. 18:12
kilden bruker

stemmer
3

I Xcode 9.3 kan du gjøre det ved hjelp av storyboard som nedenfor,

skriv bildebeskrivelse her

Du må sette tittelen på knappen textAlignment å sentrere

button.titleLabel?.textAlignment = .center

Du trenger ikke å sette tittelen tekst med ny linje (\ n) som nedenfor,

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

Bare still tittel,

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

Her er resultatet,

skriv bildebeskrivelse her

Svarte 31/05/2018 kl. 06:14
kilden bruker

stemmer
3

Du må legge til denne koden:

buttonLabel.titleLabel.numberOfLines = 0;
Svarte 21/02/2018 kl. 11:41
kilden bruker

stemmer
3

Som Brent idé om å sette tittelen UILabel som søsken visning, ser det ikke ut for meg som en veldig god idé. Jeg tenker i interaksjons problemer med UILabel grunn av sine berørings hendelser ikke får gjennom UIButton syn.

På den annen side, med en UILabel som subview av UIButton, jeg er ganske komfortable å vite at berørings hendelser vil alltid bli overført til den UILabel er Super.

Jeg tok denne tilnærmingen og ikke merke noen av problemene rapportert med backgroundImage. Jeg har lagt inn denne koden i -titleRectForContentRect: en UIButton underklasse men koden kan også plasseres i tegningen rutine av UIButton Super, noe som i så fall skal du erstatte alle referanser til selv med UIButton variable.

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

Jeg tok tiden og skrev litt mer om dette her . Det har jeg også peke en kortere løsning, selv om det ikke helt passer alle scenariene og innebærer noen private visninger hacking. Også det kan du laste ned en UIButton underklasse klar til å brukes.

Svarte 09/03/2009 kl. 14:25
kilden bruker

stemmer
2

Hvis du bruker auto-oppsett.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2
Svarte 09/12/2016 kl. 10:55
kilden bruker

stemmer
2

Innstilling lineBreakMode å NSLineBreakByWordWrapping (enten i IB eller kode) gjør knappeetikett linjer, men påvirker ikke knappens ramme.

Hvis knappen har dynamisk tittel, det er ett triks: sette skjult UILabel med samme skrifttype og knytte det er høyden til knappens høyde med layout; når satt tekst til knappen og etiketten og Autooppsett vil gjøre alt arbeidet.

Merk

Intrinsic størrelse høyde på én linje knappen er større enn etiketten, så for å hindre etiketten høyde krympe det er vertikal innhold Hugging prioritet må være større enn knappens vertikal innhold Compression Resistance.

Svarte 31/08/2015 kl. 20:21
kilden bruker

stemmer
2

Hvis du bruker auto-oppsett på iOS 6 kan du også sette preferredMaxLayoutWidtheiendommen:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
Svarte 01/05/2013 kl. 18:45
kilden bruker

stemmer
2

Det fungerer perfekt.

Legg til bruker dette med config fil som plist, må du bruke CDATA å skrive multilined tittelen, som dette:

<string><![CDATA[Line1
Line2]]></string>
Svarte 11/05/2011 kl. 10:04
kilden bruker

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

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
Svarte 03/08/2017 kl. 09:40
kilden bruker

stemmer
0

I Swift 5.0 og Xcode 10,2

SharedClass eksempel skrive en gang og bruker hver ware

Dette er din felles klasse (som dette du bruke alle komponenter egenskaper)

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

I ViewController samtale som dette

button.btnMultipleLines()//This is your button
Svarte 29/04/2019 kl. 07:54
kilden bruker

stemmer
0

Jeg hadde et problem med auto-oppsett, etter å ha aktivert multi-line ble resultatet slik: slik at størrelsen ikke påvirke knappestørrelsen Jeg har lagt basert på (i dette tilfellet contentEdgeInsets var (10, 10, 10, 10 ) etter ringer : håper det kan hjelpe deg (swift 5.0):
skriv bildebeskrivelse her
titleLabel
ConstraintscontentEdgeInsets
makeMultiLineSupport()
skriv bildebeskrivelse her

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

}
Svarte 11/04/2019 kl. 21:25
kilden bruker

stemmer
0

I disse dager, hvis du virkelig trenger denne typen ting å være tilgjengelig i Interface Builder fra sak til sak, kan du gjøre det med en enkel utvidelse som dette:

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

Så kan du bare sette numberOfLines som et attributt på noen UIButton eller UIButton underklasse som om det var en etikett. Det samme gjelder for en hel rekke andre vanligvis-utilgjengelige verdier, for eksempel hjørnet radius av en visning er lag, eller attributtene skyggen at det kaster.

Svarte 17/11/2018 kl. 07:12
kilden bruker

stemmer
0

Jeg innarbeidet jessecurry svar innen STAButton som er en del av mine STAControls åpen kildekode bibliotek. Jeg bruker det i en av de apps jeg utvikler og det fungerer for mine behov. Føl deg fri til å åpne spørsmål om hvordan du kan forbedre den, eller sende meg trekke forespørsler.

Svarte 05/05/2018 kl. 23:27
kilden bruker

stemmer
0

swift 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)
Svarte 25/03/2018 kl. 12:50
kilden bruker

stemmer
0

Roll din egen knapp klasse. Det er uten tvil den beste løsningen i det lange løp. UIButton og andre UIKit klasser er svært restriktive i hvordan du kan tilpasse dem.

Svarte 10/03/2009 kl. 13:16
kilden bruker

stemmer
-3

Selv om det er greit å legge en subview til en kontroll, er det ingen garanti for det vil faktisk fungerer, fordi kontrollen ikke kan forvente at det skal være der og kan dermed oppføre seg dårlig. Hvis du kan komme unna med det, bare legge etiketten som et søsken syn på knappen og sette rammen slik at den overlapper knappen; så lenge det er satt til å vises på toppen av knappen, vil ingenting knappen kan gjøre skjule det.

Med andre ord:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
Svarte 03/03/2009 kl. 12:04
kilden bruker

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