Wie kann ich die Lücke zwischen Zeilen (Zeilenabstand) in einer mehrzeiligen UILabel
ändern?
Edit: Offensichtlich wird NSAttributedString
es ab iOS 6 tun. Anstelle eines NSString
zum Festlegen des Beschriftungstextes erstellen Sie ein NSAttributedString
, legen Sie Attribute fest und setzen Sie ihn als .attributedText
auf dem Etikett ein. Der gewünschte Code sieht etwa so aus:
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;
Das alte attributedStringWithString von NSAttributedString hat dasselbe getan, aber jetzt wird das veraltet.
Aus historischen Gründen hier meine ursprüngliche Antwort:
Kurze Antwort: Sie können nicht. Um den Abstand zwischen den Textzeilen zu ändern, müssen Sie UILabel
subclassieren und Ihr eigenes drawTextInRect
rollen, mehrere Beschriftungen erstellen oder eine andere Schriftart verwenden (möglicherweise eine für eine bestimmte Zeilenhöhe bearbeitete Antwort, siehe Phillipe's Antwort).
Lange Antwort: In der Print- und Online-Welt wird der Abstand zwischen den Textzeilen als "Leading" (Reime mit "Überschrift") bezeichnet und stammt aus dem vor Jahrzehnten verwendeten Bleimetall. Leading ist eine schreibgeschützte Eigenschaft von UIFont
, die in 4.0 nicht mehr unterstützt wird und durch lineHeight
ersetzt wird. Soweit ich weiß, gibt es keine Möglichkeit, eine Schrift mit bestimmten Parametern wie lineHeight
zu erstellen. Sie erhalten die Systemzeichensätze und alle benutzerdefinierten Zeichensätze, die Sie hinzufügen, können sie jedoch nicht anpassen, sobald sie installiert sind.
In UILabel
gibt es auch keinen Abstandsparameter.
Ich bin mit dem Verhalten von UILabel
nicht sonderlich zufrieden, daher schlage ich vor, eine eigene Unterklasse zu schreiben oder eine Drittanbieter-Bibliothek zu verwenden. Das macht das Verhalten unabhängig von Ihrer Schriftart und die am meisten wiederverwendbare Lösung.
Ich wünschte, war mehr Flexibilität in UILabel
, und ich würde mich freuen, wenn ich mich als falsch erweise!
Ab ios 6 können Sie im UILabel eine attributierte Zeichenfolge setzen:
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 ;
Meine Lösung bestand darin, die Schriftartdatei selbst zu patchen und ihre Zeilenhöhe definitiv zu korrigieren. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/
Ich musste 'lineGap', 'ascender', 'descender' im 'hhea'-Block ändern (wie im Blog-Beispiel).
Vom Interface Builder:
Programmatisch:
Swift 4
Etikettenerweiterung verwenden
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
}
}
Rufen Sie jetzt die Nebenstellenfunktion an
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
Oder mit Label-Instanz (Kopieren Sie diesen Code einfach und führen Sie ihn aus, um das Ergebnis anzuzeigen)
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
Swift 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
Dieser Typ hat eine Klasse zum Abrufen der Zeilenhöhe erstellt (ohne Verwendung von CoreText als MTLabel-Bibliothek): https://github.com/LemonCake/MSLabel
Das Beste was ich gefunden habe ist: https://github.com/mattt/TTTAttributedLabel
Es handelt sich um eine UILabel-Unterklasse, sodass Sie sie einfach ablegen und dann die Zeilenhöhe ändern können:
myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
Ich habe Drittanbieter-Bibliotheken gefunden.
https://github.com/Tuszy/MTLabel
Die einfachste Lösung zu sein.
Hier ist ein schneller Code, mit dem Sie den Zeilenabstand programmgesteuert einstellen können
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
Natürlich funktioniert Mikes Antwort nicht, wenn Sie die Zeichenfolge programmgesteuert übergeben. In diesem Fall müssen Sie eine zugewiesene Zeichenfolge übergeben und ihren Stil ändern.
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;