Antworten:
Bearbeiten: Offensichtlich NSAttributedString
wird es unter iOS 6 und höher tun. Anstatt mit a NSString
den Text des Etiketts festzulegen, erstellen Sie ein NSAttributedString
, legen Sie Attribute darauf fest und legen Sie es dann als .attributedText
auf dem Etikett fest. Der gewünschte Code lautet ungefähr so:
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;
NSAttributedStrings alter attributedStringWithString hat das Gleiche getan, aber jetzt das ist veraltet.
Aus historischen Gründen ist hier meine ursprüngliche Antwort:
Kurze Antwort: Sie können nicht. Um den Abstand zwischen Textzeilen zu ändern, müssen Sie UILabel
Ihre eigenen Unterklassen drawTextInRect
erstellen und rollen , mehrere Beschriftungen erstellen oder eine andere Schriftart verwenden (möglicherweise eine, die für eine bestimmte Zeilenhöhe bearbeitet wurde, siehe Phillipes Antwort).
Lange Antwort: In der Print- und Online-Welt wird der Abstand zwischen den Textzeilen als "führend" bezeichnet (reimt sich auf "Überschrift" und stammt aus dem vor Jahrzehnten verwendeten Bleimetall). Leading ist eine schreibgeschützte Eigenschaft von UIFont
, die in 4.0 veraltet und durch ersetzt wurde lineHeight
. Soweit ich weiß, gibt es keine Möglichkeit, eine Schriftart mit einem bestimmten Parametersatz zu erstellen, z lineHeight
. Sie erhalten die Systemschriftarten und alle benutzerdefinierten Schriftarten, die Sie hinzufügen, können diese jedoch nach der Installation nicht mehr anpassen.
Es gibt auch keinen Abstandsparameter in UILabel
.
Ich bin mit UILabel
dem Verhalten nicht besonders zufrieden , daher empfehle ich, eine eigene Unterklasse zu schreiben oder eine Bibliothek eines Drittanbieters zu verwenden. Dadurch wird das Verhalten unabhängig von Ihrer Schriftartauswahl und die am besten wiederverwendbare Lösung.
Ich wünschte , es war mehr Flexibilität bei UILabel
, und ich würde gerne als falsch sein!
Ab iOS 6 können Sie im UILabel eine zugeordnete Zeichenfolge festlegen:
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
zum Beispiel die Textausrichtung des Etiketts deaktiviere, also musst du es dem Absatzstil hinzufügen.
Sie können den Zeilenabstand im Storyboard steuern:
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 Erweiterungsfunktion auf
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 verwenden Sie die Label-Instanz (Kopieren Sie einfach diesen Code und führen Sie ihn aus, um das Ergebnis zu sehen.)
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
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).
Dieser Typ hat eine Klasse erstellt, um die Zeilenhöhe zu ermitteln (ohne CoreText als MTLabel-Bibliothek zu verwenden): https://github.com/LemonCake/MSLabel
Das Beste, was ich gefunden habe, ist: https://github.com/mattt/TTTAttributedLabel
Es ist 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 Bibliotheken von Drittanbietern wie diese gefunden:
https://github.com/Tuszy/MTLabel
Die einfachste Lösung 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;