Jak zmienić odstęp między wierszami (odstępy między wierszami) w multilinii UILabel?
Odpowiedzi:
Edycja: Najwyraźniej NSAttributedStringzrobi to na iOS 6 i nowszych. Zamiast używać NSStringdo ustawiania tekstu etykiety, utwórz NSAttributedString, ustaw atrybuty, a następnie ustaw jako .attributedTextna etykiecie. Kod, który chcesz, będzie wyglądał mniej więcej tak:
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;
Stary attributedStringWithString NSAttributedString za zrobił to samo, ale teraz , że jest przestarzała.
Z powodów historycznych, oto moja pierwotna odpowiedź:
Krótka odpowiedź: nie możesz. Aby zmienić odstępy między wierszami tekstu, będziesz musiał podklasować UILabeli zawinąć własne drawTextInRect, utworzyć wiele etykiet lub użyć innej czcionki (być może takiej, która została edytowana dla określonej wysokości wiersza, zobacz odpowiedź Phillipe'a).
Długa odpowiedź: W świecie druku i internetu przestrzeń między wierszami tekstu jest określana jako „wiodąca” (rymuje się z „nagłówkiem” i pochodzi od ołowianego metalu używanego dziesiątki lat temu). Leading to właściwość tylko do odczytu programu UIFont, która została wycofana w wersji 4.0 i zastąpiona przez lineHeight. O ile wiem, nie ma możliwości utworzenia czcionki o określonym zestawie parametrów, takich jak lineHeight; otrzymujesz czcionki systemowe i każdą dodaną niestandardową czcionkę, ale nie możesz ich modyfikować po zainstalowaniu.
Nie ma też parametru odstępu UILabel.
Nie jestem szczególnie zadowolony z UILabeljego zachowania, więc sugeruję napisanie własnej podklasy lub skorzystanie z biblioteki innej firmy. Dzięki temu zachowanie będzie niezależne od wybranej czcionki i będzie rozwiązaniem najbardziej wielokrotnego użytku.
Chciałbym, żeby było więcej elastyczności UILabeli byłbym szczęśliwy, że się mylę!
Począwszy od ios 6, możesz ustawić przypisany ciąg w UILabel:
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 ;
AttributedStringwyłącza na przykład wyrównanie tekstu etykiety, więc musisz dodać go do stylu akapitu.
Z programu Interface Builder:

Programowo:
SWift 4
Korzystanie z rozszerzenia etykiety
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
}
}
Teraz funkcja rozszerzenia połączeń
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
Lub za pomocą instancji etykiety (po prostu skopiuj i wykonaj ten kod, aby zobaczyć wynik)
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
Szybki 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
Moim rozwiązaniem było poprawienie samego pliku czcionki i definitywne poprawienie wysokości linii. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/
Musiałem zmodyfikować „lineGap”, „ascender”, „descender” w bloku „hhea” (jak w przykładzie na blogu).
Ten facet stworzył klasę, aby uzyskać wysokość linii (bez używania CoreText, jako biblioteki MTLabel): https://github.com/LemonCake/MSLabel
Najlepsze, co znalazłem, to: https://github.com/mattt/TTTAttributedLabel
Jest to podklasa UILabel, więc możesz ją po prostu upuścić, a następnie zmienić wysokość wiersza:
myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
Znalazłem biblioteki innych firm, takie jak ta:
https://github.com/Tuszy/MTLabel
To najłatwiejsze rozwiązanie.
Oto krótki kod do programowego ustawiania odstępów między wierszami
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
Oczywiście odpowiedź Mike'a nie zadziała, jeśli programowo przekażesz łańcuch. W takim przypadku musisz przekazać przypisany ciąg i zmienić jego styl.
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;