Bir çoklu satırda satırlar arasındaki boşluğu (satır aralığı) nasıl değiştirebilirim UILabel
?
Yanıtlar:
Düzenleme: Açıkça NSAttributedString
, iOS 6 ve sonrasında yapacak. NSString
Etiketin metnini ayarlamak için bir kullanmak yerine , bir oluşturun NSAttributedString
, üzerinde öznitelikler ayarlayın, ardından .attributedText
etiket ü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ığı, UIFont
4.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 UILabel
yok.
Bu UILabel
davranışı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 UILabel
ve ben kanıtlanmış yanlış olduğu mutluluk duyarız!
İ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 ;
AttributedString
, örneğin etiketin metin hizalamasını devre dışı bırakarak eklerdim, bu yüzden onu paragraf stiline eklemeniz gerekir.
Film şeridinde satır aralığını kontrol edebilirsiniz:
Arayüz Oluşturucu'dan:
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
Çö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).
Bu adam satır yüksekliğini elde etmek için bir sınıf oluşturdu (MTLabel kitaplığı olarak CoreText kullanmadan): https://github.com/LemonCake/MSLabel
Bulduğum en iyi şey: https://github.com/mattt/TTTAttributedLabel
Bu bir UILabel alt sınıfıdır, böylece onu bırakabilir ve ardından satır yüksekliğini değiştirebilirsiniz:
myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 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
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;