wake-up-neo.net

Legen Sie den UILabel-Zeilenabstand fest

Wie kann ich die Lücke zwischen Zeilen (Zeilenabstand) in einer mehrzeiligen UILabel ändern?

96
Matrix

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!

120
AndrewS

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 ;
74
iosMentalist

Sie können den Zeilenabstand im Storyboard steuern:

Frage duplizieren

54
Mike S

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

16
Philippe

Vom Interface Builder:

enter image description here

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
14
Krunal

Dieser Typ hat eine Klasse zum Abrufen der Zeilenhöhe erstellt (ohne Verwendung von CoreText als MTLabel-Bibliothek): https://github.com/LemonCake/MSLabel

8
Grsmto

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

Ich habe Drittanbieter-Bibliotheken gefunden. 

https://github.com/Tuszy/MTLabel

Die einfachste Lösung zu sein.

4

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
1
ullstrm

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