Stellen Sie den UILabel-Zeilenabstand ein

Antworten:

122

Bearbeiten: Offensichtlich NSAttributedStringwird es unter iOS 6 und höher tun. Anstatt mit a NSStringden Text des Etiketts festzulegen, erstellen Sie ein NSAttributedString, legen Sie Attribute darauf fest und legen Sie es dann als .attributedTextauf 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 UILabelIhre eigenen Unterklassen drawTextInRecterstellen 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 UILabeldem 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!

AndrewS
quelle
1
Ich habe es mit der Unterklassifizierung von UILabel gemacht. Grundsätzlich besteht die Idee darin, den Etikettentext in Token zu unterteilen und dann die Identitätslänge jedes Tokens zu bestimmen, für jedes Token ein separates Label zu erstellen und nacheinander anzuhängen. Das ist es.
Matrix
3
Lügen! ;) Sie können eine Schriftartdatei patchen, um die Zeilenhöhe zu ändern - siehe meine Antwort auf dieser Seite.
Philippe
Ich bin zu der Überzeugung gelangt , dass es mit NSAttributedString eine Möglichkeit gibt, dies zu tun. Wenn Sie in iOS 6 Beschriftungen mit zugewiesenen Zeichenfolgen benötigen, lesen Sie OHAttributedLabel .
Spencer Williams
Tun Sie es mit NSAttributesString, wenn Sie iOS> = 6 verwenden. Beispiel
d.ennis
Dies ist einfach und funktioniert gut.
R. Mohan
75

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 ;
iosMentalist
quelle
1
Vielen Dank! Ich würde das hinzufügen, indem ich AttributedStringzum Beispiel die Textausrichtung des Etiketts deaktiviere, also musst du es dem Absatzstil hinzufügen.
Cyborg86pl
56

Sie können den Zeilenabstand im Storyboard steuern:

doppelte Frage

Mike S.
quelle
10
Wenn Sie jedoch in Xcode 6.1.1 die Beschriftung auswählen und den Zeilenwert im zugewiesenen Bereich ändern, flackert der Bereich und sperrt die Anwendung. Ich konnte das Panel nur durch erzwungenes Beenden von Xcode verlassen.
izk
4
Daumen hoch für die Animation
Tieme
1
In Version 7.1 wechselt das Bedienfeld und hat keinen Einfluss auf die Laufzeit. Musste es im Code machen.
MiguelSlv
440 Watt Strom lief gerade durch mein Panel;)
Sarasranglt
23

Vom Interface Builder:

Geben Sie hier die Bildbeschreibung ein

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
Krunal
quelle
Müssen nur eine Argumentationslinie passierenPacing oder multipleLineheight, kann nicht beide Argumente passieren, sonst wird kein Ergebnis kommen, denke ich
Arpit B Parekh
16

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).

Philippe
quelle
Super cool! Diese OS X-Schriftarttools funktionierten auch für meine OTF-Schriftart (obwohl nur TTF angegeben ist ...). Meine Schrift hatte eine Zeilenhöhe von 1000 (!), Ich habe sie auf 0 und voila geändert. Ich hatte Meilen und Meilen leeren Raums unter dem Text in jeder Zeile.
Jonny
2
Ich kann nicht glauben, dass dies die beste Lösung ist (keine Beleidigung!), Aber es ist bei weitem die einfachste. Ich habe die kostenlose (Windows) Software Type Light (und unter Font | Metrics | Advanced können Sie lineGap ändern) verwendet, um meine Schriftarten zu bearbeiten. Außerdem können Sie die Schriftarten "umbenennen", was ich mit dem erwähnten Tool Philippe nicht herausfinden konnte.
Kirk Woll
Das ist fantastisch @Philippe! Danke für den Beitrag !!
Robbie
Weitere Einzelheiten finden Sie
Phatmann
@iamjustaprogrammer Es ist wieder online.
Matt B.
8

Dieser Typ hat eine Klasse erstellt, um die Zeilenhöhe zu ermitteln (ohne CoreText als MTLabel-Bibliothek zu verwenden): https://github.com/LemonCake/MSLabel

adriendenat
quelle
7

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;
lms
quelle
4

Ich habe Bibliotheken von Drittanbietern wie diese gefunden:

https://github.com/Tuszy/MTLabel

Die einfachste Lösung sein.

Derek Bredensteiner
quelle
MSLabel ist eine bessere
Billionen
2

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
ullstrm
quelle
0

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;
Ricardo Mutti
quelle