Başlığında iki satırlık metin bulunan UIButton (numberOfLines = 2)


87

UIButtonBaşlık etiketinde iki satırlık bir metin olan bir yapmaya çalışıyorum . Kullandığım kod bu:

    UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    [titleButton setTitle:@"This text is very long and should get truncated at the end of the second line" forState:UIControlStateNormal];
    titleButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    titleButton.titleLabel.numberOfLines = 2;
    [self addSubview:titleButton];

Bunu denediğimde, metin yalnızca bir satırda görünüyor. Birden fazla metin satırına ulaşmanın tek yolu UIButton.titleLabelayarlamak numberOfLines=0ve kullanmaktır UILineBreakModeWordWrap. Ancak bu, metnin tam olarak iki satır olmasını garanti etmez.

UILabelBununla birlikte, düz kullanmak işe yarar:

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
    titleLabel.numberOfLines = 2;
    titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    [self addSubview:titleLabel];

UIButtonİşi iki satırla nasıl yapacağını bilen var mı ? UILabelMetni tutmak için ayrı bir metin oluşturup düğmenin alt görünümü olarak eklemenin tek çözümü var mı ?



Viraj, evet, ayarlar numberOfLines=0ve kullanırsanız UILineBreakModeWordWrap, birden fazla satır elde edebilirsiniz. Bununla ilgili sorun, metin çok uzunsa ikiden fazla satır verebilmesidir. İkinci satırın sonunda elips bulunan tam olarak iki boşluk istiyorum (metin çok uzunsa).
pazarlamacı

Öyleyse sanırım alt görünüm eklemek, gidilecek tek yol olabilir.
Viraj

Yanıtlar:


87

Daha yeni iOS sürümleri için güncellenmiş yanıt

Kabul edilen cevap bu olduğundan, @ Sean'ın cevabını buraya ekledi:

Bu özellikleri düğmenizin titleLabel üzerinde ayarlayın.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2; // if you want unlimited number of lines put 0

Swift 3 ve 4:

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.numberOfLines = 2 // if you want unlimited number of lines put 0

İOS'un daha eski bir sürümü için orijinal cevap

Üstüne 2 satırlık metin UIButtonistiyorsanız UIlabel, üstüne tam olarak bunu yapan bir tane eklemelisiniz .

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
titleLabel.numberOfLines = 2;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
[myButton addSubview:titleLabel]; //add label to button instead.

Arayüz oluşturucu çözümü için güncellendi

Daha eksiksiz bir cevap için @Borut Tomazin'in cevabı eklendi. @Borut Tomazin'in cevabı iyileştirildiği için bu kısım tekrar güncellendi.

Bunu kod gerektirmeden çok daha kolay yapabilirsiniz. Arayüz Oluşturucu'da Line BreakUIButton'da olarak ayarlandı Word Wrap. Birden fazla başlık satırı ekleyebilirsiniz. Sadece hit Option + Returnyeni bir satır yapmak için anahtarları. Bunu ayrıca Arayüz Oluşturucu'daki Kullanıcı Tanımlı Çalışma Zamanı Özniteliğine eklemeniz gerekir:

titleLabel.textAlignment Number [1]

5
UILineBreakModekullanımdan kaldırıldı, NSLineBreakModeonun yerine kullanın
gu Guillaume

2
Bu, son iOS sürümleri için gereksizdir. @ Sean'ın cevabına bakın.
cbowns

146

UIButton'a UILabel eklemenize gerek yoktur. Bu sadece ekstra nesneler ve çalışma.

Bu özellikleri düğmenizin titleLabel üzerinde ayarlayın.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2;//if you want unlimited number of lines put 0

Swift:

button.titleLabel!.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel!.numberOfLines = 2//if you want unlimited number of lines put 0

6
Bu 2013'tür ve bugün itibariyle bu, en gelişmiş çözümdür.
Klaas

@ Ne yazık ki atlayamazsınız ve kodla yapmanız gerekir. Bu işlevselliği isteyen Apple'a bir hata raporu göndermeye değer olabilir.
bpapa

@bpapa Evet Katılıyorum, görsel senaryo taslakları daha esnek olmalı.
Blip

6
Bu benim için işe yarıyor, ancak düğmenin varsayılan davranışını bozuyor intrinsicContentSize, bu da yalnızca bir metin satırına karşılık gelen bir yükseklik döndürüyor. Düğmeyi intrinsicContentSizeyüksekliği olarak ayarladığım yeri geçersiz kılarak düzelttim [self.titleLabel sizeThatFits(CGSizeMake(self.titleLabel.frame.size.width, CGFLOAT_MAX)].height.
Elise

@WillVonUllrich, çünkü kabul edilen yanıtı yalnızca düzenlendiği zaman değiştirebilirsiniz. Bu cevapları kabul edilene ekledim, böylece daha fazla bakmayanlara kabul edilen cevaptan yardımcı olacak.
Totumus Maximus

88

Bunu kod gerektirmeden çok daha kolay yapabilirsiniz. Arayüz Oluşturucu'da Line BreakUIButton'da olarak ayarlandı Word Wrap. Birden fazla başlık satırı ekleyebilirsiniz. Sadece hit Option + Returnyeni bir satır yapmak için anahtarları. Bunu ayrıca Arayüz Oluşturucu'daki Kullanıcı Tanımlı Çalışma Zamanı Özniteliğine eklemeniz gerekir:

titleLabel.textAlignment Number [1]

Bu kadar basit. Umarım yardımcı olur...


1
Bu çözüm, basit durumlar için şu anda kabul edilen çözümden daha iyidir (daha az nesne, kod).
Jonathan Zhan

1
"Daha az nesne" argümanınız geçersiz olacak şekilde programlı olarak yapacağınızla tam olarak aynı özellikleri ayarlarsınız. Kod belki daha azdır. Ama daha okunaklı.
Seçiminizi yapın

Oh, kararsızdım sanırım. Açıklığa kavuşturmaya çalıştığınız için teşekkürler. IB'ye karşı Kod'da yapıldığı gerçeğiyle pek ilgilenmiyordu. Borut'un çözümüne ek bir etiket eklemenize gerek kalmaması ve aynı şeyi başarması ile ilgili daha çok şey var. Ama evet, ikisi de harika çalışıyor. :)
Jonathan Zhan

böylesine basit bir görev için koda geçme ihtiyacı gerçekten çok zor.
Can Poyrazoğlu

3
Interface Builder'da titleLabel.textAlignment User Defined Runtime Attribute'u ekleyerek ve Number = 1 (NSTextAlignmentCenter'ın değeri) olarak ayarlayarak aynı hedefe% 100 kodsuz ulaşabilirsiniz.
2014

21
 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

Mükemmel olan! NSStringİçini bölmek zorunda değilsin setTitle. WordWrapping bunu sizin için yapıyor!
Alex Cio

Benim için dizeyi set başlığının içine bölmem gerekiyordu. Bu olmadan işe yaramadı
user1960169

9

Kodu düzenleme ihtiyacını ve dolayısıyla görünümünüzü alt sınıflandırma ihtiyacını tamamen ortadan kaldırmak için, Xcode5 ve üzerinde Borut Tomazin'in önerisini takip edebilirsiniz:

Arayüz Oluşturucu'da (veya film şeridi) Satır Sonunu Kelime Kaydırma olarak ayarlayın. Birden fazla başlık satırı ekleyebilirsiniz. Sadece hit Option+ Returnyeni bir satır yapmak için anahtarları.

ve ardından, Kullanıcı Tanımlı Çalışma Zamanı Özniteliklerinde ekleyebilirsiniz.

Anahtar yolu: titleLabel.textAlignment
Tür: Number
Değer:1

Not: Bu, UITextAlignmentCentersabiti sayısal değerine çevirdiğimiz için (ve yeni iOS sürümleri yayınlandıkça bu sabit değişebilir) tamamen "geleceğe yönelik" olmayabilir, ancak yakın gelecekte güvenli görünüyor.


1

Gerekli değeri doğrudan Öykü Panosu'ndan değiştirebilirsiniz. Düğmeyi seçin, kimlik denetçisine gidin ve "Kullanıcı tanımlı çalışma zamanı özellikleri" bölümüne aşağıdaki anahtar / değer çiftini ekleyin:

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.