UILabel satır aralığını ayarla


Yanıtlar:


122

Düzenleme: Açıkça NSAttributedString, iOS 6 ve sonrasında yapacak. NSStringEtiketin metnini ayarlamak için bir kullanmak yerine , bir oluşturun NSAttributedString, üzerinde öznitelikler ayarlayın, ardından .attributedTextetiket üzerinde olarak ayarlayın . İstediğiniz kod şu şekilde olacaktır:

NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:@"Sample text"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attrString addAttribute:NSParagraphStyleAttributeName
    value:style
    range:NSMakeRange(0, strLength)];
uiLabel.attributedText = attrString;

NSAttributedString'in eski attributedStringWithString'i aynı şeyi yaptı, ama şimdi bu kullanımdan kaldırılıyor.

Tarihsel nedenlerden dolayı, işte benim orijinal cevabım:

Kısa cevap: yapamazsınız. Metin satırları arasındaki aralığı değiştirmek için UILabel, kendi alt sınıfınızı alt sınıflara ayırmanız ve yuvarlamanız drawTextInRect, birden çok etiket oluşturmanız veya farklı bir yazı tipi kullanmanız gerekir (belki de belirli bir satır yüksekliği için düzenlenmiş bir yazı tipi, Phillipe'nin cevabına bakın).

Uzun cevap: Basılı ve çevrimiçi dünyada, metin satırları arasındaki boşluk "satır aralığı" olarak bilinir ("başlık" ile kafiyeli ve onlarca yıl önce kullanılan kurşun metalden gelir). Satır aralığı, UIFont4.0'da kullanımdan kaldırılan ve ile değiştirilen salt okunur bir özelliktir lineHeight. Bildiğim kadarıyla, belirli bir parametre setiyle bir yazı tipi oluşturmanın bir yolu yok lineHeight; sistem yazı tiplerini ve eklediğiniz herhangi bir özel yazı tipini alırsınız, ancak yüklendikten sonra bunları değiştiremezsiniz.

İçinde aralık parametresi de UILabelyok.

Bu UILabeldavranışından özellikle memnun değilim , bu yüzden kendi alt sınıfınızı yazmanızı veya bir 3. taraf kitaplığı kullanmanızı öneririm. Bu, davranışı yazı tipi seçiminizden bağımsız hale getirecek ve en yeniden kullanılabilir çözüm olacaktır.

Orada dilek oldu daha fazla esneklik UILabelve ben kanıtlanmış yanlış olduğu mutluluk duyarız!


1
Bunu UILabel alt sınıflandırma ile yaptım, temelde fikir etiket metnini belirteçlere bölmek ve ardından her bir belirteç için kimlik uzunluğu, her simge için ayrı bir etiket oluşturmak ve birbiri ardına eklemek. Bu kadar.
Matrix

3
Yalanlar! ;) Satır yüksekliğini değiştirmek için bir yazı tipi dosyasına yama uygulayabilirsiniz - bu sayfadaki cevabıma bakın.
Philippe

Bunu NSAttributedString ile yapmanın bir yolu olduğuna inanmaya yönlendirildim. İOS 6'dan önce ilişkilendirilmiş dizelere sahip etiketlere ihtiyacınız varsa, OHAttributedLabel'e göz atın .
Spencer Williams

İOS> = 6 kullanıyorsanız bunu NSAttributesString ile yapın. Örnek
d.ennis

Bu Basit ve İyi Çalışıyor.
R.Mohan

75

İos 6'dan başlayarak, UILabel'de bir öznitelik dizisi belirleyebilirsiniz:

NSString *labelText = @"some text"; 
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:40];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
cell.label.attributedText = attributedString ;

1
Teşekkürler! Bunu AttributedString, örneğin etiketin metin hizalamasını devre dışı bırakarak eklerdim, bu yüzden onu paragraf stiline eklemeniz gerekir.
cyborg86pl

56

Film şeridinde satır aralığını kontrol edebilirsiniz:

yinelenen soru


10
Ancak Xcode 6.1.1'de etiketin seçilmesi ve atfedilen paneldeki satır değerinin değiştirilmesi, panelin titremesine ve uygulamayı kilitlemesine neden olacaktır. Panelden yalnızca Xcode'u zorla çıkarak çıkabildim.
izk

4
Animasyon için
beğeniler

1
7.1 sürümünde panel hareket eder ve çalışma süresi üzerinde herhangi bir etkisi yoktur. Kodla yapmak zorundaydı.
MiguelSlv

Şu anda
panelimden

23

Arayüz Oluşturucu'dan:

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

Programlı olarak:

SWift 4

Etiket uzantısını kullanma

extension UILabel {

    func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {

        guard let labelText = self.text else { return }

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple

        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}

Şimdi telefon uzantısı işlevi

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"

// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) .  // try values 1.0 to 5.0

// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0


Veya etiket örneğini kullanarak (Sonucu görmek için bu kodu kopyalayıp çalıştırmanız yeterlidir)

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40

// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))

// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))

label.attributedText = attrString

Hızlı 3

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString

Sadece bir tartışma satırını geçmem gerekiyorSpacing veya multipleLineheight, her ikisini de geçemez, diğer akıllıca hiçbir sonuç gelmeyecek, sanırım
Arpit B Parekh

16

Çözümüm, yazı tipi dosyasının kendisini yamamak ve satır yüksekliğini kesinlikle sabitlemekti. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

'Hhea' bloğundaki 'lineGap', 'ascender', 'descender'ı değiştirmek zorunda kaldım (blog örneğindeki gibi).


Süper havalı! Bu OS X yazı tipi araçları, OTF yazı tipim için de çalıştı (sadece TTF ... belirtmesine rağmen). Yazı tipimin satır yüksekliği 1000 (!) Vardı, onu 0 olarak değiştirdim ve işte. Her satırda metnin altında millerce ve millerce boş alan vardı.
Jonny

2
Bunun en iyi çözüm olduğuna inanamıyorum (alınmayın!), Ama açık ara en basit olanı. Fontlarımı düzenlemek için ücretsiz (Windows) Type Light yazılımını kullandım (ve Font | Metrics | Advanced altında lineGap'i değiştirebilirsiniz). Ayrıca Philippe'in bahsettiği aracı kullanarak nasıl yapılacağını anlayamadığım yazı tiplerini "yeniden adlandırmanıza" izin veriyor.
Kirk Woll

Bu harika @Philippe! Gönderi için teşekkürler !!
Robbie

Daha ayrıntılı bilgi için benzer bir soruya verdiğim yanıta da bakın: stackoverflow.com/a/19553827/201828
phatmann

@iamjustaprogrammer Yine yayında.
Matt B.




2

Satır aralığını programlı olarak ayarlamanız için bazı hızlı kodlar

let label = UILabel()

let attributedText = NSMutableAttributedString(string: "Your string")
let paragraphStyle = NSMutableParagraphStyle()

//SET THIS:
paragraphStyle.lineSpacing = 4
//OR SET THIS:
paragraphStyle.lineHeightMultiple = 4

//Or set both :)

let range = NSMakeRange(0, attributedText.length)
attributedText.addAttributes([NSParagraphStyleAttributeName : paragraphStyle], range: range)
label.attributedText = attributedText

0

Elbette, dizeyi programlı olarak geçirirseniz Mike'ın cevabı işe yaramaz. Bu durumda, ilişkilendirilmiş bir dizeyi iletmeniz ve stilini değiştirmeniz gerekir.

NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;
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.