Nasıl bir UIButton için çok satırlı metin eklerim?

oy
313

Takip koduna sahibim...

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

... Aslında yapılması düğme için çok satırlı metin olabilir olmanın, ancak metin her zaman UIButton ait Backgroundımage belirsizleşmektedir. düğmenin subviews göstermek için bir günlük çağrı UILabel eklendiğini gösterir, ancak metnin kendisi görülemez. Bu bir UIButton içinde böcek ya da ben yapıyorum şey mi oldu?

Oluştur 03/03/2009 saat 01:22
kaynak kullanıcı
Diğer dillerde...                            


26 cevaplar

oy
618

IOS 6 ve üstünde, birden fazla satır izin vermek için aşağıdaki kullanımı:

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

iOS 5 için ve kullanım aşağıdaki altında birden fazla satır izin vermek:

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

2017, ileriye iOS9 için ,

Genellikle, sadece bu iki şey:

  1. seçim "Attributed Metin"
  2. "Satır Sonu" pop-up üzerinde seçmek "Word Wrap"
Cevap 01/12/2009 saat 23:34
kaynak kullanıcı

oy
114

Seçilen cevap doğru ama Interface Builder bu tür bir şey yapmak isterseniz bunu yapabilirsiniz:

pic

Cevap 14/05/2014 saat 16:36
kaynak kullanıcı

oy
53

IOS 6 için:

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

Gibi

UILineBreakModeWordWrap and UITextAlignmentCenter

itibaren IOS 6 kaldırılıyor ..

Cevap 08/10/2012 saat 08:14
kaynak kullanıcı

oy
41

Birden çizgilerle merkezli başlığı ile bir düğme eklemek istiyorsanız, düğme için Arayüz Oluşturucu ayarları ayarlayın:

[ İşte]

Cevap 21/10/2015 saat 09:03
kaynak kullanıcı

oy
28

Roger Nolan'ın öneri yeniden ifade Ancak, müstehcen kodla, bu genel bir çözümdür için:

button.titleLabel?.numberOfLines = 0
Cevap 28/10/2010 saat 16:45
kaynak kullanıcı

oy
17

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Cevap 08/05/2017 saat 09:56
kaynak kullanıcı

oy
10

çok daha kolay bir yolu var:

someButton.lineBreakMode = UILineBreakModeWordWrap;

iOS 3 ve sonrası için (Düzenleme :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Cevap 25/10/2009 saat 20:48
kaynak kullanıcı

oy
9

Otomatik mizanpaj ile -iOS7 üzerinde hizalama Sol:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Cevap 28/06/2013 saat 20:07
kaynak kullanıcı

oy
7

Her şeyden önce, sen UIButton zaten içinde bir UILabel sahip olduğunu bilmelidir. Şu bağlantıyı kullanarak ayarlayabilirsiniz –setTitle:forState:.

Senin örnekle sorun UILabel en ayarlamanız gerekir olmasıdır numberOfLinesAyrıca gözden geçirmelidir 1. varsayılan değerini dışında bir özelliği lineBreakModeözelliği.

Cevap 03/03/2009 saat 09:35
kaynak kullanıcı

oy
4

Cevapları burada nasıl programlı satırlı düğme başlığıyla ulaşmak için size.

Sadece görsel senaryolar kullanıyorsanız, yazdığınız anlamına eklemek istedim [Ctrl + Enter] bir düğme başlık sahada satıra zorlamak.

HTH

Cevap 01/05/2013 saat 10:50
kaynak kullanıcı

oy
4

Xcode 4'ün film şeridi kullanarak olanlar için, butona tıklayabilir ve sağ tarafta Araçları altında Müfettiş, Hat kırılmak için bir seçenek göreceksiniz Özellikleri bölmesinde. Kelime Wrap seçin ve gitmek iyi olmalıdır.

Cevap 09/05/2012 saat 19:12
kaynak kullanıcı

oy
3

Kardeş görünüm olarak başlık UILabel koyma Brent fikrine gelince, bu çok iyi bir fikir gibi bana görünmüyor. Ben nedeniyle dokunmatik olayları UIButton bakış yoluyla elde edemez UILabel ile etkileşim sorunları düşünüyorum.

Öte yandan, UIButton ait subview bir UILabel, ben dokunmatik olayları hep UILabel en Superview yayılmış olacaktır bilerek oldukça konforlu değilim.

Ben bu yaklaşımı sürdü ve Backgroundımage ile bildirilen sorunlardan birini fark etmedi. Bir UIButton alt sınıfının ama kodu da bu durumda size UIButton en değişkenle kendini tüm başvuruları yerini alacaktır UIButton Superview, rutinini çizim yerleştirilebilir: Ben -titleRectForContentRect bu kodu eklendi.

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

Vaktim yaptı ve bu konuda biraz daha yazdı buraya . Oldukça tüm senaryolar uydurmak ve hack bazı özel görünümler içerir vermez gerçi Orada, ben de daha kısa çözüm etmektedir. Ayrıca orada, sen kullanılmaya hazır bir UIButton alt sınıfını indirebilirsiniz.

Cevap 09/03/2009 saat 15:25
kaynak kullanıcı

oy
2

Bu kod eklemek zorunda:

buttonLabel.titleLabel.numberOfLines = 0;
Cevap 21/02/2018 saat 11:41
kaynak kullanıcı

oy
2

Otomatik düzenini kullanın.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2
Cevap 09/12/2016 saat 10:55
kaynak kullanıcı

oy
2

(IB veya kod olarak) NSLineBreakByWordWrapping için lineBreakMode Ayar düğmesi etiket satırlı yapar, ama düğmenin çerçeveyi etkilemez.

düğme dinamik başlık varsa, bir hile var: Aynı yazı ile gizli UILabel koyup düzen ile düğmenin yüksekliğine yükseklik var kravat; düğme ve etiket ve Otomatik mizanpaj olarak ayarlanmış metin tüm çalışmaları yapacaktır.

Not

Tek satırlık düğmeye İçsel boyutunun yüksekliği böylece etiketin yüksekliği dikey İçerik Hugging Öncelik düğmesinin dikey İçerik Sıkıştırma Direnci daha büyük olmalıdır var küçültmek önlemek için, etiket en büyüktür.

Cevap 31/08/2015 saat 20:21
kaynak kullanıcı

oy
2

IOS 6 üzerinde otomatik düzen kullanırsanız, ayrıca ayarlamak gerekebilir preferredMaxLayoutWidthözelliği:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
Cevap 01/05/2013 saat 19:45
kaynak kullanıcı

oy
2

Bu mükemmel çalışıyor.

PLIST gibi yapılandırma dosyası ile bu kullanmak ekle, böyle, multilined başlık yazmak için CDATA kullanmak gerekir:

<string><![CDATA[Line1
Line2]]></string>
Cevap 11/05/2011 saat 11:04
kaynak kullanıcı

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

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
Cevap 03/08/2017 saat 09:40
kaynak kullanıcı

oy
0

In Swift 5.0 ve Xcode 10.2

SharedClass örneği bir kez yazmak ve her tesisat kullanmak

Bu (bu gibi tüm bileşenlerin özelliklerini kullanın) paylaşılan sınıftır

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

Sizin de ViewController böyle çağrısı

button.btnMultipleLines()//This is your button
Cevap 29/04/2019 saat 07:54
kaynak kullanıcı

oy
0

Sonucun böyleydi çok satırlı etkinleştirdikten sonra, otomatik düzen ile bir sorunu vardı: böylece boyut düğmesi boyutunu etkilemez ben eklendi ettik dayalı idi (bu durumda contentEdgeInsets içinde 10, 10, 10, 10 ( ) çağrıldıktan sonra : ) size (hızlı 5.0 yardım umut:
Burada görüntü açıklama girin
titleLabel
ConstraintscontentEdgeInsets
makeMultiLineSupport()
Burada görüntü açıklama girin

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

}
Cevap 11/04/2019 saat 21:25
kaynak kullanıcı

oy
0

Eğer gerçekten bir vaka ile ayrı ayrı arayüz oluşturucu erişilebilir olmasını bu tür bir şey gerekiyorsa Bugünlerde, bu gibi basit bir uzantısı ile yapabilirsiniz:

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

Bir etiket sanki Sonra basitçe herhangi UIButton veya UIButton alt sınıf bir niteliği olarak numberOfLines ayarlayabilirsiniz. Aynı tür bir görünümün tabakasının köşe yarıçapı ya da bıraktığı gölgenin nitelikler gibi diğer genellikle girilemeyen değerler, bir bütün ana için de geçerli.

Cevap 17/11/2018 saat 07:12
kaynak kullanıcı

oy
0

Xcode 9.3 size kullanarak bunu yapabilirsiniz film şeridi gibi aşağıda,

Burada görüntü açıklama girin

Sen ortalamak için düğmeye başlık textAlignment ayarlamanız gerekir

button.titleLabel?.textAlignment = .center

Sen, aşağıda gibi yeni hat (\ n) ile başlık metnini ayarlamak gerekmez

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

Basitçe başlığını ayarlayın

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

İşte sonuç,

Burada görüntü açıklama girin

Cevap 31/05/2018 saat 06:14
kaynak kullanıcı

oy
0

Ben dahil jessecurry cevabını içinde STAButton benim parçasıdır STAControls açık kaynak kütüphanesi. Şu anda ben geliştiriyorum uygulamasından biri içinde kullanmak ve bu benim ihtiyaçları için çalışır. Onu geliştirmek ya da beni istekleri çekme göndermek için nasıl sorunları açmak için çekinmeyin.

Cevap 05/05/2018 saat 23:27
kaynak kullanıcı

oy
0

swift 4,0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)
Cevap 25/03/2018 saat 12:50
kaynak kullanıcı

oy
0

Kendi düğme sınıfı yuvarlayın. Uzun vadede çok iyi çözüm kenarında. UIButton ve diğer UIKit sınıfları bunları nasıl özelleştirebileceğiniz çok kısıtlayıcı.

Cevap 10/03/2009 saat 14:16
kaynak kullanıcı

oy
-3

o bir denetime bir subview eklemek için tamam olmasına rağmen kontrol orada olmasını bekliyoruz olmayabilir ve bu nedenle kötü davranabilir, çünkü aslında çalışacağız hiçbir garantisi yoktur. Ondan ile alabilirsiniz, sadece düğmeye kardeş görünümü olarak etiket ekleyebilir ve bu düğmeye üst üste gelmesi amacıyla çerçevesini ayarlamak; yeter ki düğmeye üstünde görünür şekilde ayarlanmış olarak, düğme yapabileceği bir şey bunu gizleyebilir olacaktır.

Diğer bir deyişle:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
Cevap 03/03/2009 saat 13:04
kaynak kullanıcı

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