Hogyan adjunk több soros szöveget egy UIButton?

szavazat
313

Én a következő kódot ...

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

... az ötlet is, hogy én is többsoros szöveget a gomb, de a szöveg mindig elfedi a backgroundImage a UIButton. A naplózás hívást, hogy bemutassák a subviews a gomb mutatja, hogy a UILabel került, de maga a szöveg nem látható. Ez egy hiba UIButton vagy én csinálok valamit rosszul?

A kérdést 03/03/2009 01:22
a forrás felhasználó
Más nyelveken...                            


26 válasz

szavazat
618

Az iOS 6 és újabb esetén használják a következő, hogy több vonal:

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

Az iOS 5 és régebbi használatát a következő, hogy több vonal:

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

2017 az iOS9 előre ,

Általában csak az alábbi két dolog:

  1. válassza „tulajdonított szöveg”
  2. A „Line Break” felugró válassza „Szótörés”
Válaszolt 01/12/2009 23:34
a forrás felhasználó

szavazat
114

A kiválasztott válasz helyes, de ha úgy tetszik, hogy ezt a fajta dolog, az Interface Builder ezt megteheti:

pic

Válaszolt 14/05/2014 16:36
a forrás felhasználó

szavazat
53

Az iOS 6:

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

Mint

UILineBreakModeWordWrap and UITextAlignmentCenter

elavultnak IOS 6-tól ..

Válaszolt 08/10/2012 08:14
a forrás felhasználó

szavazat
41

Ha hozzá szeretne adni egy gombot a cím középre több vonallal, állítsa be az Interface Builder beállításokat a gomb:

[ itt]

Válaszolt 21/10/2015 09:03
a forrás felhasználó

szavazat
28

Újramegállapításának Roger Nolan javaslatát, de explicit kód, ez az általános megoldás:

button.titleLabel?.numberOfLines = 0
Válaszolt 28/10/2010 16:45
a forrás felhasználó

szavazat
17

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Válaszolt 08/05/2017 09:56
a forrás felhasználó

szavazat
10

Van egy sokkal egyszerűbb módja:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(Edit az iOS 3 és újabb :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Válaszolt 25/10/2009 20:48
a forrás felhasználó

szavazat
9

Balra igazítás a iOS7 az Elrendezés:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Válaszolt 28/06/2013 20:07
a forrás felhasználó

szavazat
7

Először is, tudnia kell, hogy UIButton már van UILabel benne. Beállíthatjuk, hogy a –setTitle:forState:.

A probléma a példa, hogy meg kell állítani UILabel a numberOfLinestulajdonságot valami más, mint az alapértelmezett érték 1. Tekintse át a lineBreakModetulajdon.

Válaszolt 03/03/2009 09:35
a forrás felhasználó

szavazat
4

Válaszok itt mondani, hogyan lehet elérni a többsoros gombra cím programozott.

Csak azt akartam hozzátenni, hogy ha használ készítőivel, akkor írja be a [Ctrl + Enter] kényszeríteni egy új sort a gomb neve mezőben.

HTH

Válaszolt 01/05/2013 10:50
a forrás felhasználó

szavazat
4

Azok számára, akik használják Xcode 4-es storyboard, akkor kattintson a gombra, és a jobb oldalon Utilities ablaktábla Tulajdonságok Inspector, akkor egy lehetőséget lát Sortörés. Válassza Sortördelés, és nem lesz jó menni.

Válaszolt 09/05/2012 19:12
a forrás felhasználó

szavazat
3

Ami Brent ötlet, hogy a cím UILabel mint testvér véli, nem tűnik számomra, mint egy nagyon jó ötlet. Arra gondolok kölcsönhatásban problémák a UILabel miatt érintési események nem jut el a UIButton véleménye.

Másrészt, a UILabel mint subview a UIButton, én elég kényelmes, tudván, hogy az érintési eseményeket mindig lesznek továbbítva az UILabel a SuperView.

Én ezt a megközelítést, és nem vette észre semmilyen problémát jelentett backgroundImage. Tettem hozzá ezt a kódot az -titleRectForContentRect: egy UIButton alosztály de a kód is elhelyezhető rajz rutin a UIButton SuperView, ami ebben az esetben meg kell cserélni az összes utalást a self a UIButton a változó.

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

Tettem, hogy az idő, és írt egy kicsit többet erről itt . Ott én is pont rövidebb megoldást, bár nem egészen illik a forgatókönyvet, és magában foglalja néhány saját nézeteit hacker. Szintén ott, akkor töltse le a UIButton alosztály használatra kész.

Válaszolt 09/03/2009 15:25
a forrás felhasználó

szavazat
2

Meg kell adni ezt a kódot:

buttonLabel.titleLabel.numberOfLines = 0;
Válaszolt 21/02/2018 11:41
a forrás felhasználó

szavazat
2

Ha az automatikus elrendezés.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2
Válaszolt 09/12/2016 10:55
a forrás felhasználó

szavazat
2

Beállítás lineBreakMode a NSLineBreakByWordWrapping (akár IB vagy kód) teszi gombfeliratának többsoros, de nem befolyásolja a gomb keretben.

Ha gombnak dinamikus cím, van egy trükk: hogy rejtett UILabel azonos betűtípust és nyakkendő ez a magasság gombbal magassága elrendezése; ha meg szöveget gombot, a címke és Elrendezés teszi a munkát.

jegyzet

Lényegi mérete magassága egysoros gomb nagyobb, mint címke, így megakadályozzák címke magassága csökken ez függőleges Content Hugging prioritás kell, hogy legyen nagyobb, mint gomb függőleges Content Compression ellenállás.

Válaszolt 31/08/2015 20:21
a forrás felhasználó

szavazat
2

Ha az automatikus elrendezés iOS 6 akkor azt is be kell állítani az preferredMaxLayoutWidthingatlan:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
Válaszolt 01/05/2013 19:45
a forrás felhasználó

szavazat
2

Ez tökéletesen működik.

Hozzá kell használni ezt a config file mint Plist, akkor kell használni CDATA írni a multilined cím, mint ez:

<string><![CDATA[Line1
Line2]]></string>
Válaszolt 11/05/2011 11:04
a forrás felhasználó

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

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
Válaszolt 03/08/2017 09:40
a forrás felhasználó

szavazat
0

A Swift 5.0 és Xcode 10.2

SharedClass például egyszer írható, és minden áru

Ez az Ön megosztott osztály (mint ez használ az összes komponenst tulajdonságok)

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

Az Ön ViewController hívást, mint ez

button.btnMultipleLines()//This is your button
Válaszolt 29/04/2019 07:54
a forrás felhasználó

szavazat
0

Volt egy kérdés az automatikus elrendezés, engedélyezése után többsoros az eredmény volt, mint ez: így a mérete nem befolyásolja a gomb méretét adtam alapján (ebben az esetben contentEdgeInsets volt (10, 10, 10, 10 ) hívása után : remélem, ez segít (gyors 5.0):
írja kép leírása itt
titleLabel
ConstraintscontentEdgeInsets
makeMultiLineSupport()
írja kép leírása itt

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

}
Válaszolt 11/04/2019 21:25
a forrás felhasználó

szavazat
0

Ezek a napok, ha tényleg szükség van az ilyesmit is elérhetők lesznek a felületépítő egy eseti elbírálás alapján, meg tudod csinálni egy egyszerű kiterjesztése, mint ez:

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

Akkor egyszerűen állítsa numberOfLines mint attribútum bármely UIButton vagy UIButton alosztály, mintha egy címkét. Ugyanez vonatkozik egy egész sereg egyéb rendszerint-megközelíthetetlen értékek, mint a saroksugarainak néző rétegét, illetve az attribútumok az árnyék hogy ez nem vet.

Válaszolt 17/11/2018 07:12
a forrás felhasználó

szavazat
0

Az Xcode 9.3 megteheti segítségével storyboard , mint az alábbi,

írja kép leírása itt

Be kell állítani gomb cím TextAlignment a központtól

button.titleLabel?.textAlignment = .center

Nem kell beállítani cím szöveg új sorban (\ n), mint az alábbi,

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

Egyszerűen állítsa címet,

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

Íme az eredmény,

írja kép leírása itt

Válaszolt 31/05/2018 06:14
a forrás felhasználó

szavazat
0

Azt építeni jessecurry válasza belül STAButton amely része a STAControls könyvtár nyílt forráskódú. Én jelenleg használ belül az egyik apps én fejlődő és működik a saját igényeinek. Nyugodtan nyitott kérdések, hogyan lehetne javítani, vagy küldje húzzam kéréseket.

Válaszolt 05/05/2018 23:27
a forrás felhasználó

szavazat
0

swift 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)
Válaszolt 25/03/2018 12:50
a forrás felhasználó

szavazat
0

Roll saját gomb osztályban. Ez messze a legjobb megoldás hosszú távon. UIButton és egyéb UIKit osztályok nagyon korlátozó hogyan lehet testre szabni azokat.

Válaszolt 10/03/2009 14:16
a forrás felhasználó

szavazat
-3

Bár ez rendben van, hogy adjunk egy subview egy kontroll, nincs garancia arra, hogy ezzel tulajdonképpen működik, mert a szabályozás esetleg nem várhatjuk el, hogy ott lenni, és ilyen módon viselkednek rosszul. Ha nem kap el vele, csak add a címke testvér kilátás a gombot, és állítsa be a keretet úgy, hogy az fedje a gombot; amíg a beállított érték jelenik meg a tetején a gombot, semmi gomb tehet pedig elhomályosítja.

Más szavakkal:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
Válaszolt 03/03/2009 13:04
a forrás felhasználó

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