Jak přidat text víceřádkový na UIButton?

hlasů
313

Mám následující kód ...

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

... představa je, že mohu mít multi-řádku textu tlačítka, ale text je vždy zakryta BackgroundImage na UIButton. Zaznamenávat výzva ukázat subviews tlačítka ukazuje, že UILabel byla přidána, ale samotný text nelze vidět. Je to chyba v UIButton nebo dělám něco špatně?

Položena 03/03/2009 v 01:22
zdroj uživatelem
V jiných jazycích...                            


26 odpovědí

hlasů
618

Pro iOS 6 a výše, pomocí následujícího postupu, aby více řádků:

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

Pro iOS 5 a dále použít následující povolit více řádků:

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

2017, pro iOS9 dopředu ,

Obecně platí, že prostě dělat tyto dvě věci:

  1. zvolit "Attributed Text"
  2. na „Linka break“ vyskakovacího okna vyberte možnost „zalamování řádků“
Odpovězeno 01/12/2009 v 23:34
zdroj uživatelem

hlasů
114

Zvolená odpověď je správná, ale pokud dáváte přednost dělat takové věci v Interface Builder můžete udělat toto:

pic

Odpovězeno 14/05/2014 v 16:36
zdroj uživatelem

hlasů
53

Pro iOS 6:

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

Tak jako

UILineBreakModeWordWrap and UITextAlignmentCenter

se nepoužívá v IOS 6 dále ..

Odpovězeno 08/10/2012 v 08:14
zdroj uživatelem

hlasů
41

Chcete-li přidat tlačítko s názvem středem s více řádky, nastavte nastavení vašeho Interface Builder pro tlačítka:

[ tady]

Odpovězeno 21/10/2015 v 09:03
zdroj uživatelem

hlasů
28

Přepracovat Roger Nolan je návrh, ale s výslovným kódem, to je obecné řešení:

button.titleLabel?.numberOfLines = 0
Odpovězeno 28/10/2010 v 16:45
zdroj uživatelem

hlasů
17

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Odpovězeno 08/05/2017 v 09:56
zdroj uživatelem

hlasů
10

Tam je mnohem jednodušší způsob:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(Úprava pro iOS 3 a později :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Odpovězeno 25/10/2009 v 20:48
zdroj uživatelem

hlasů
9

Levý odpovídala iOS7 s Automatický návrh:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Odpovězeno 28/06/2013 v 20:07
zdroj uživatelem

hlasů
7

Za prvé, měli byste si být vědomi toho, že UIButton již má UILabel uvnitř ní. Můžete ji nastavit pomocí –setTitle:forState:.

Problém s příkladu je, že je třeba nastavit UILabel je numberOfLinesvlastnost na jinou hodnotu než výchozí hodnotu 1. Ty by měly také přezkoumat lineBreakModemajetek.

Odpovězeno 03/03/2009 v 09:35
zdroj uživatelem

hlasů
4

Odpovědi vám zde poradí, jak dosáhnout víceřádkového titulu tlačítka programově.

Jen jsem chtěl dodat, že pokud používáte storyboardy, můžete zadat [Ctrl + Enter] vynutit nový řádek na titulní tlačítko pole.

HTH

Odpovězeno 01/05/2013 v 10:50
zdroj uživatelem

hlasů
4

Pro ty, kteří jsou za použití Xcode 4 je storyboard, můžete kliknout na tlačítko, a na pravé straně nástroje podokně pod atributy inspektor, uvidíte možnost pro zalomení řádku. Zvolit zalamování a vy byste měli být dobré jít.

Odpovězeno 09/05/2012 v 19:12
zdroj uživatelem

hlasů
3

Co se týče Brent myšlenkou uvedení názvu UILabel as ohledem sourozence, ale nezdá se mi to jako dobrý nápad. Pořád myslím na problémy interakce s UILabel kvůli jeho dotykové události nejsou dostat skrze UIButton pohledu.

Na druhou stranu, s UILabel jako subview na UIButton, jsem docela confortable s vědomím, že dotykové události budou vždy být rozšířena až na UILabel je SuperView.

Já jsem tento přístup a nevšiml si některý z problémů hlášených v souvislosti s BackgroundImage. Přidal jsem tento kód do -titleRectForContentRect: z UIButton podtřídy ale kód může být rovněž umístěny v kreslení rutinu UIButton SuperView, což v tomto případě nahrazují veškeré odkazy na sebe s UIButton je proměnné.

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

Udělal jsem si čas a napsal o něco více o tom zde . Tam jsem se také poukázat kratší řešení, i když to není úplně vhodná pro všechny scénáře a zahrnuje některé soukromé názory hackerů. Také zde si můžete stáhnout UIButton podtřídy připraven k použití.

Odpovězeno 09/03/2009 v 15:25
zdroj uživatelem

hlasů
2

Budete muset přidat tento kód:

buttonLabel.titleLabel.numberOfLines = 0;
Odpovězeno 21/02/2018 v 11:41
zdroj uživatelem

hlasů
2

Používáte-li automatické rozložení.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2
Odpovězeno 09/12/2016 v 10:55
zdroj uživatelem

hlasů
2

Nastavení lineBreakMode na NSLineBreakByWordWrapping (buď v IB nebo kód) umožňuje tlačítko štítek víceřádkový, ale nemá vliv na rám tlačítka.

Pokud tlačítko má dynamický název, je tam jeden trik: dát skrytou UILabel se stejným písmem a kravatu je výška k výšce Button s rozložením; při nastavení textu na tlačítku a na štítku a Automatický návrh udělá všechnu práci.

Poznámka

Vnitřní výška velikost tlačítka jednořádkové je větší než značka, takže aby se zabránilo labelu výška zmenšit to vertikální Content Objímání Přednost musí být větší než Button vertikální obsahu odolnosti vůči tlaku.

Odpovězeno 31/08/2015 v 20:21
zdroj uživatelem

hlasů
2

Používáte-li automatické rozložení na iOS 6 můžete také nutné nastavit preferredMaxLayoutWidthvlastnost:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
Odpovězeno 01/05/2013 v 19:45
zdroj uživatelem

hlasů
2

Funguje to perfektně.

Přidat používat to s konfiguračním souboru jako PLIST, musíte použít CDATA psát multilined titul, jako je tento:

<string><![CDATA[Line1
Line2]]></string>
Odpovězeno 11/05/2011 v 11:04
zdroj uživatelem

hlasů
1
self.btnError.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
Odpovězeno 03/08/2017 v 09:40
zdroj uživatelem

hlasů
0

V Swift 5.0 a Xcode 10.2

SharedClass příklad napsat jednou a použít veškeré nádobí

To je vaše sdílené třída (takhle použít všechny komponenty vlastnosti)

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

Ve vašem ViewController hovoru takhle

button.btnMultipleLines()//This is your button
Odpovězeno 29/04/2019 v 07:54
zdroj uživatelem

hlasů
0

Měl jsem problém s auto-layout, po povolení vícelinkovém Výsledkem bylo takhle: tak velikost nemá vliv na velikost tlačítka Přidal jsem na základě (v tomto případě contentEdgeInsets byl (10, 10, 10, 10 ) po zavolání : doufám, že vám (sWIFT 5.0 pomoci):
zadejte popis obrázku zde
titleLabel
ConstraintscontentEdgeInsets
makeMultiLineSupport()
zadejte popis obrázku zde

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

}
Odpovězeno 11/04/2019 v 21:25
zdroj uživatelem

hlasů
0

V těchto dnech, pokud opravdu potřebujete tento druh věcí, aby byly přístupné v stavitel rozhraní případ od případu, můžete to udělat pomocí jednoduchého rozšíření, jako je tento:

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

Pak můžete jednoduše nastavit početřádek jako atribut na libovolném UIButton nebo UIButton podtřídy, jako kdyby se jednalo o štítek. Totéž platí i pro celou řadu dalších obvykle nepřístupných-hodnot, jako je poloměr rohové vrstvy zaměřením má, nebo atributy stínu, který vrhá.

Odpovězeno 17/11/2018 v 07:12
zdroj uživatelem

hlasů
0

V Xcode 9.3, můžete to udělat pomocí storyboard jako níže,

zadejte popis obrázku zde

Je třeba nastavit titulní tlačítka TextAlignment centra

button.titleLabel?.textAlignment = .center

Nemusíte nastavit titulní text nového řádku (\ n), jako níže,

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

Jednoduše nastavit název,

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

Zde je výsledek,

zadejte popis obrázku zde

Odpovězeno 31/05/2018 v 06:14
zdroj uživatelem

hlasů
0

Začleněny I odpověď jessecurry v rámci STAButton který je součástí mé STAControls open source knihovny. I v současné době používají ji v jedné z aplikací jsem rozvojových a funguje to pro mé potřeby. Neváhejte a otevřených otázek o tom, jak ji vylepšit, nebo mi poslat vytáhnout požadavky.

Odpovězeno 05/05/2018 v 23:27
zdroj uživatelem

hlasů
0

swift 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)
Odpovězeno 25/03/2018 v 12:50
zdroj uživatelem

hlasů
0

Vytvořit vlastní tlačítko třídu. To je zdaleka nejlepší řešení v dlouhodobém horizontu. UIButton a další UIKit třídy jsou velmi restriktivní v tom, jak je můžete upravit.

Odpovězeno 10/03/2009 v 14:16
zdroj uživatelem

hlasů
-3

I když je to v pořádku přidat subview ke kontrole, není žádná záruka, že to bude skutečně fungovat, protože ovládací prvek nemusí očekávat, že to bude tam a mohlo by tedy chovají špatně. Pokud se můžete dostat pryč s ním, stačí přidat štítek jako sourozenci výhledem na tlačítko a nastavte jeho rám tak, aby se překrývala s tlačítkem; tak dlouho, jak je to nastaveno, aby se objeví v horní části tlačítka, nic tlačítka může dělat ji zakrývat.

Jinými slovy:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
Odpovězeno 03/03/2009 v 13:04
zdroj uživatelem

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