So steuern Sie den Zeilenabstand in UILabel

273

Ist es möglich, die Lücke zwischen Text zu verringern, wenn mehrere Zeilen in a UILabeleingefügt werden? Wir können den Rahmen, die Schriftgröße und die Anzahl der Zeilen einstellen. Ich möchte die Lücke zwischen den beiden Zeilen in diesem Etikett verringern.

Abhinav
quelle
2
Darf ich vorschlagen, dass Sie eine der Antworten akzeptieren, die für iOS 6.0 und höher korrekt sind? Die aktuell akzeptierte Antwort ist veraltet.
Mark Amery
Verwenden Sie für jede Zeile eine neue UILabelund binden Sie dann alle Beschriftungen in a ein StackView. Zum Schluss stellen Sie die spacingvon ein StackView. Denken Sie daran, sie vertikal zu stapeln.
Honig
Siehe den folgenden Link für die Lösung in Swift 2. stackoverflow.com/a/39158698/6602495
Sneha
Weitere Informationen zu Storyboard-Optimierungen und anderen Details finden Sie unter stackoverflow.com/a/44325650/342794 .
lal

Antworten:

261

Ich habe darüber nachgedacht, dieser Antwort etwas Neues hinzuzufügen, damit ich mich nicht so schlecht fühle ... Hier ist eine schnelle Antwort:

import Cocoa

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40

let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString

"Kurze Antwort: Sie können nicht. Um den Abstand zwischen Textzeilen zu ändern, müssen Sie UILabel unterordnen und Ihr eigenes drawTextInRect rollen oder mehrere Beschriftungen erstellen."

Siehe: UILabel-Zeilenabstand festlegen


Dies ist eine wirklich alte Antwort, und andere haben bereits die neue und bessere Möglichkeit hinzugefügt, damit umzugehen. Bitte beachten Sie die aktuellen Antworten unten.

Mazyod
quelle
23
Seit iOS 6.0 können Sie es über steuern NSAttributedString(auch in den Eigenschaften von UILable im Xcode Interface Builder verfügbar).
ıɾuǝʞ
13
Interessanterweise können Sie, soweit ich das beurteilen kann, einen zusätzlichen Abstand zwischen den Zeilen hinzufügen, diesen jedoch nicht verringern, NSParagraphStylewenn Sie eine verwenden NSAttributedString. (Ich muss möglicherweise mehr Tests der anderen modifizierbaren Eigenschaften durchführen, aber die lineSpacingEigenschaft erlaubt Ihnen nur, sie zu erhöhen.)
livingtech
siehe meine Antwort , um einen Weg mit NSAttributedString
d.ennis
2
@livingtech Das ist ärgerlich und ich glaube, Sie haben Recht. Haben Sie Problemumgehungen gefunden?
Dom Vinyard
7
Nur um etwas in diesem Thread zu klären. Wenn Sie den Zeilenabstand verkleinern möchten stellen Sie die Zeilenhöhe auf 1,0 und dann setLineHeightMultiple auf einen niedrigeren Wert <1,0, wie: [paragraphStyle setLineHeightMultiple: 0,8] oder paragraphStyle.lineHeightMultiple = 0,8
virsunen
401

In Xcode 6 können Sie dies im Storyboard tun:

Geben Sie hier die Bildbeschreibung ein

Mike S.
quelle
1
Nutzen Sie das Storyboard noch mehr!
Allen
22
@PaperThick haben das gleiche Problem in 6.1.1. Es "Harlem Shake" für ein paar Minuten. Weiß nicht, wie man es repariert :) Xcode Shaking
Anton Gaenko
8
Gibt es eine Möglichkeit, benutzerdefinierte Schriftarten auf diese Weise festzulegen? Ich kann diese helvetica neue scheinbar nicht in eine andere Schriftart ändern.
Marcos Curvello
2
Wenn Sie 'Attributed' aktivieren und dann die Datei als Quellcode öffnen, können Sie das 'lineHeightMultiple' manuell bearbeiten und daher den Harlem Shake-Fehler
ED-209
2
@azdev für alle, die sich das noch ansehen, ich bekomme die Shakes in Xcode 7.3 länger, aber ich denke, dies ist die erste Version, in der es kein Problem war
LulzCow
103

Ab iOS 6 können Sie dem UILabel eine zugewiesene Zeichenfolge zuweisen. Überprüfe das Folgende :

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];

label.attributedText = attributedString;
iosMentalist
quelle
1
Das attributedStringmuss ein NSMutableAttributedString(NICHT NSAttributedString) sein
Mike S
14
Der erste Zeilencode sollte seinNSMutableAttributedString *attributedString = [NSMutableAttributedString alloc]initWithString:@"sample text"];
Allen
Die lineSpacingEigenschaft von NSMutableParagraphStyleist niemals negativ, daher kann die Linienhöhe mit diesem Ansatz nicht verringert werden. Um die Frage zu beantworten, müssen Sie eine andere Eigenschaft verwenden, siehe @ d.ennis Antwort.
Theo
81

Die hier genannten Lösungen haben bei mir nicht funktioniert. Ich habe einen etwas anderen Weg gefunden, dies mit dem iOS 6 NSAttributeString zu tun:

myLabel.numberOfLines = 0; 
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style  = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
                                                         attributes:attributtes];   
[myLabel sizeToFit];
d.ennis
quelle
1
Die Zeilenhöhe hängt von der Schriftgröße ab. Der Zeilenabstand ist genau das, der Zeilenabstand. Möglicherweise können Sie Probleme lösen, indem Sie nur die minimale / maximale Zeilenhöhe festlegen. Dies liegt jedoch nur daran, dass die aktuell verwendeten Schriftgrößen nicht größer als die Zeilenhöhengrenzen sind. In der Dokumentation heißt es: "... Glyphen und Grafiken, die diese Höhe überschreiten, überlappen benachbarte Linien ... Obwohl diese Begrenzung für die Linie selbst gilt, fügt der Zeilenabstand zusätzlichen Abstand zwischen benachbarten Linien hinzu."
Ari Braginsky
+1, Wenn Sie den Abstand zwischen Zeilen verringern möchten, möchten Sie dies tun. Der tatsächliche Zeilenabstand ist höchstwahrscheinlich standardmäßig 0, daher wird angegeben, dass Sie ihn nur vergrößern können. Das Problem, dass der Abstand zu groß ist, liegt darin, dass die Linienhöhe zu groß ist. Aus diesem Grund wird die Arbeit in 99% der Fälle erledigt.
Lawicko
1
Dies ist die einzige Antwort, die ich finden konnte, die den tatsächlichen Zeilenhöhenwert (anstelle eines Verhältnisses) verwendet, der für Entwurfsanwendungen wie Photoshop, Sketch, CSS usw. üblich ist
Albert Bori
35

Ich habe diese einfache Erweiterung gemacht, die für mich sehr gut funktioniert:

extension UILabel {
    func setLineHeight(lineHeight: CGFloat) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = lineHeight
        paragraphStyle.alignment = self.textAlignment

        let attrString = NSMutableAttributedString()
        if (self.attributedText != nil) {
            attrString.append( self.attributedText!)
        } else {
            attrString.append( NSMutableAttributedString(string: self.text!))
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
        }
        attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

Kopieren Sie dies in eine Datei, damit Sie es so verwenden können

myLabel.setLineHeight(0.7)
Agustin Meriles
quelle
Denken Sie daran, wenn Sie dies tun, während Sie auch Storyboard für dieses Label verwenden, stellen Sie sicher, dass Sie die Zeilen Ihres Labels auf 0 setzen
Honey
Warum stellen Sie die lineSpacingEinstellung nicht einfach direkt ein und vergessen sie lineHeightMultiple?
Honig
Da der Schlüssel zum Reduzieren der Zeilenhöhe 'lineHeightMultiple' ist, kein Zeilenabstand
Agustin Meriles
Angenommen, Sie möchten, dass Ihre Zeilenhöhe 1,4 beträgt. Warum können Sie nicht einfach schreiben .lineSpacing = 1.4und alles vergessen .lineHeightMultiple...
Honey
Hah! Ich habe es versucht und es hat nicht funktioniert, aber ich frage mich, warum ich hier keine anderen Antworten sehe, die Ihren Mechanismus nicht verwenden. Ich meine, sie setzen einfach direkt den Zeilenabstand. Siehe die akzeptierte Antwort ...
Honey
33

Vom Interface Builder (Storyboard / XIB):

Geben Sie hier die Bildbeschreibung ein

Programmatisch:

SWift 4

Etikettenerweiterung verwenden

extension UILabel {

    // Pass value for any one of both parameters and see result
    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 = "How to\ncontrol\nthe\nline spacing\nin UILabel"
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 = "How to\ncontrol\nthe\nline spacing\nin UILabel"
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
2
Fügen Sie die Zeile "agraphStyle.alignment = self.textAlignment "hinzu, um die ursprüngliche Ausrichtung beizubehalten. Andernfalls wird der Text linksbündig ausgerichtet.
Nithin Michael
Wenn Sie bei großen Texten Auslassungspunkte verlieren, verwenden Sie :agraphStyle.lineBreakMode = .byTruncatingTail
christostsang
19

In iOS 6 gibt es jetzt eine alternative Antwort, bei der attributedText auf dem Etikett mithilfe eines NSAttributedString mit den entsprechenden Absatzstilen festgelegt wird. In dieser Antwort zum Stapelüberlauf finden Sie Details zur Zeilenhöhe mit NSAttributedString:

Kerntext - NSAttributedString Zeilenhöhe richtig gemacht?

Traumwieber
quelle
16

Hier ist eine Klasse der Unterklasse UILabel mit der Eigenschaft Zeilenhöhe: https://github.com/LemonCake/MSLabel

adriendenat
quelle
Das hat bei mir funktioniert, danke. Ich habe auch versucht, MTLabel zu verwenden, aber dieses war besser.
Denis Kutlubaev
1
Weiß jemand, ob MSLabel das Zeichen '\ n' unterstützt?
Achi
11

In Swift und als Funktion, inspiriert von DarkDust

// Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20)
func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat)
{
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = lineSpacing

    let attrString = NSMutableAttributedString(string: text)
    attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

    label.attributedText = attrString
}
Thyselius
quelle
7

Laut der Antwort von @Mike lineHeightMultipleist das Reduzieren von der entscheidende Punkt. Beispiel unten, es funktioniert gut für mich:

    NSString* text = label.text;
    CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: label.font}].width;
    if (textWidth > label.frame.size.width) {
        NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
        paragraph.alignment = NSTextAlignmentCenter;
        paragraph.lineSpacing = 1.0f;
        paragraph.lineHeightMultiple = 0.75;     // Reduce this value !!!
        NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text];
        [attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)];
        label.attributedText = attrText;
    }
isaacselement
quelle
6

SWIFT 3 nützliche Erweiterung, um den Abstand zwischen Zeilen einfacher einzustellen :)

extension UILabel
{
    func setLineHeight(lineHeight: CGFloat)
    {
        let text = self.text
        if let text = text 
        {

            let attributeString = NSMutableAttributedString(string: text)
            let style = NSMutableParagraphStyle()

           style.lineSpacing = lineHeight
           attributeString.addAttribute(NSParagraphStyleAttributeName,
                                        value: style,
                                        range: NSMakeRange(0, text.characters.count))

           self.attributedText = attributeString
        }
    }
}
Kevin Sabbe
quelle
5

Ich habe einen Weg gefunden, wie Sie die tatsächliche Zeilenhöhe festlegen können (kein Faktor) und sie sogar live in Interface Builder rendert . Folgen Sie einfach den Anweisungen unten. Code ist in Swift 4 geschrieben .


Schritt 1: Erstellen Sie eine Datei mit dem Namen DesignableLabel.swiftund fügen Sie den folgenden Code ein:

import UIKit

@IBDesignable
class DesignableLabel: UILabel {
    @IBInspectable var lineHeight: CGFloat = 20 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.minimumLineHeight = lineHeight
            paragraphStyle.maximumLineHeight = lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length))
            attributedText = attrString
        }
    }
}

Schritt 2: Platzieren Sie a UILabelin einem Storyboard / XIB und setzen Sie seine Klasse auf DesignableLabel. Warten Sie, bis Ihr Projekt erstellt ist (der Build muss erfolgreich sein!).

Angeben der Klasse für Ihr UILabel


Schritt 3: Jetzt sollte im Eigenschaftenbereich eine neue Eigenschaft mit dem Namen "Linienhöhe" angezeigt werden. Stellen Sie einfach den gewünschten Wert ein und Sie sollten die Ergebnisse sofort sehen!

Legen Sie die Linienhöhe in den Eigenschaften fest

Jeehut
quelle
2

Hier ist eine Unterklasse von UILabel, die festlegt lineHeightMultipleund sicherstellt, dass die Eigenhöhe groß genug ist, um keinen Text abzuschneiden.

@IBDesignable
class Label: UILabel {
    override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize
        let padding = (1.0 - lineHeightMultiple) * font.pointSize
        size.height += padding
        return size
    }

    override var text: String? {
        didSet {
            updateAttributedText()
        }
    }

    @IBInspectable var lineHeightMultiple: CGFloat = 1.0 {
        didSet {
            updateAttributedText()
        }
    }

    private func updateAttributedText() {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        attributedText = NSAttributedString(string: text ?? "", attributes: [
            .font: font,
            .paragraphStyle: paragraphStyle,
            .foregroundColor: textColor
        ])
        invalidateIntrinsicContentSize()
    }
}
Phatmann
quelle
zusätzliche Auffüllung muss sein (lineHeightMultiple - 1.0) * font.pointSize, richtig?
Pavel Alexeev
Der obige Code schien für mich zu funktionieren. Aber vielleicht hast du recht. Hast du dein Wechselgeld ausprobiert? @ PavelAlexeev
Phatmann
Nein, ich bleibe bei lineSpacing anstelle von lineHeightMultiple :)
Pavel Alexeev
1

In Swift 2.0 ...

Fügen Sie eine Erweiterung hinzu:

extension UIView {
    func attributesWithLineHeight(font: String, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [String: NSObject] {
        let titleParagraphStyle = NSMutableParagraphStyle()
        titleParagraphStyle.lineHeightMultiple = lineHeightMultiple

        let attribute = [
            NSForegroundColorAttributeName: color,
            NSKernAttributeName: kern,
            NSFontAttributeName : UIFont(name: font, size: fontSize)!,
            NSParagraphStyleAttributeName: titleParagraphStyle
        ]
        return attribute
    }
}

Legen Sie jetzt einfach Ihr UILabel als attributedText fest:

self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5))    

Offensichtlich habe ich eine Reihe von Parametern hinzugefügt, die Sie möglicherweise nicht benötigen. Spielen Sie herum - zögern Sie nicht, die Methode neu zu schreiben - ich habe nach einer Reihe verschiedener Antworten gesucht, also dachte ich mir, ich würde die gesamte Erweiterung posten, falls es jemandem da draußen hilft ... -rab

rab_w
quelle
1

Swift3 - Fügen Sie in einer UITextView- oder UILabel-Erweiterung diese Funktion hinzu:

Ich habe Code hinzugefügt, um den aktuell zugeordneten Text beizubehalten, wenn Sie bereits zugeordnete Zeichenfolgen für die Ansicht verwenden (anstatt sie zu überschreiben).

func setLineHeight(_ lineHeight: CGFloat) {
    guard let text = self.text, let font = self.font else { return }

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = 1.0
    paragraphStyle.lineHeightMultiple = lineHeight
    paragraphStyle.alignment = self.textAlignment

    var attrString:NSMutableAttributedString
    if let attributed = self.attributedText {
        attrString = NSMutableAttributedString(attributedString: attributed)
    } else {
        attrString = NSMutableAttributedString(string: text)
        attrString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, attrString.length))
    }
    attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
    self.attributedText = attrString
}
Geld
quelle
1

Eine andere Antwort ... Wenn Sie die Zeichenfolge programmgesteuert übergeben, müssen Sie eine zugewiesene Zeichenfolge anstelle einer regulären Zeichenfolge übergeben und ihren Stil ändern. (IOS10)

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
1

Swift 3-Erweiterung:

    import UIKit

extension UILabel {
    func setTextWithLineSpacing(text: String, lineHeightMultiply: CGFloat = 1.3) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiply
        paragraphStyle.alignment = .center
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
        self.attributedText = attributedString
    }
}
Roman Barzyczak
quelle
1

Dies sollte dabei helfen. Anschließend können Sie diese Beschriftung dieser benutzerdefinierten Klasse im Storyboard zuweisen und ihre Parameter direkt in den Eigenschaften verwenden:

open class SpacingLabel : UILabel {

    @IBInspectable open var lineHeight:CGFloat = 1 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = 1.0
            paragraphStyle.lineHeightMultiple = self.lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: self.text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
            self.attributedText = attrString
        }
    } 
}
Russell Warwick
quelle
Dies sollte dabei helfen. Anschließend können Sie diese Beschriftung dieser benutzerdefinierten Klasse im Storyboard zuweisen und ihre Parameter direkt in den Eigenschaften verwenden.
Russell Warwick
Bitte tragen Sie keine Inhalte zu Ihrer Antwort in die Kommentare ein. Ihre Antwort sollte hilfreich sein, ohne die Kommentare lesen zu müssen
durchlesen zu müssen
1

Swift 4 Label-Erweiterung. Erstellen von NSMutableAttributedString vor der Übergabe an die Funktion, falls für den zugeordneten Text zusätzliche Attribute erforderlich sind.

extension UILabel {

    func setLineHeightMultiple(to height: CGFloat, withAttributedText attributedText: NSMutableAttributedString) {

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = height
        paragraphStyle.alignment = textAlignment

        attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText.length - 1))

        self.attributedText = attributedText
    }
}
Edward
quelle
0

Dieser Code hat bei mir funktioniert (ios 7 & ios 8 sicher).

_label.numberOfLines=2;
_label.textColor=[UIColor whiteColor];

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple=0.5;
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = 1.0;

NSDictionary *nameAttributes=@{
                               NSParagraphStyleAttributeName : paragraphStyle,
                               NSBaselineOffsetAttributeName:@2.0
                               };


NSAttributedString *string=[[NSAttributedString alloc] initWithString:@"22m\nago" attributes:nameAttributes];
_label.attributedText=string;
Daniel Kilinskas
quelle
0

Hier ist meine Lösung in Kürze. Die Unterklasse sollte sowohl für die Eigenschaft attributeText und text als auch für characterSpacing + lineSpacing funktionieren. Der Abstand bleibt erhalten, wenn eine neue Zeichenfolge oder ein neuer Attributstring festgelegt wird.

open class UHBCustomLabel : UILabel {
    @IBInspectable open var characterSpacing:CGFloat = 1 {
        didSet {
            updateWithSpacing()
        }

    }
    @IBInspectable open var lines_spacing:CGFloat = -1 {
        didSet {
            updateWithSpacing()
        }

    }
    open override var text: String? {
        set {
            super.text = newValue
            updateWithSpacing()
        }
        get {
            return super.text
        }
    }
    open override var attributedText: NSAttributedString? {
        set {
            super.attributedText = newValue
            updateWithSpacing() 
        }
        get {
            return super.attributedText
        }
    }
    func updateWithSpacing() {
        let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!)
        attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
        if lines_spacing >= 0 {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = lines_spacing
            paragraphStyle.alignment = textAlignment
            attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        }
        super.attributedText = attributedString
    }
}
Umair
quelle
-5

Als schnelle, schmutzige, intelligente und einfache Problemumgehung:

Für UILabels, die nicht viele Zeilen haben, können Sie stattdessen stackViews verwenden.

  1. Schreiben Sie für jede Zeile ein neues Etikett.
  2. Betten Sie sie in eine StackView ein (wählen Sie beide Beschriftungen -> Editor -> Einbetten -> StackView
  3. Passen Sie die Spacingvon der StackView auf die gewünschte Menge

Stellen Sie sicher, dass Sie sie vertikal stapeln . Diese Lösung funktioniert auch für benutzerdefinierte Schriftarten.

Geben Sie hier die Bildbeschreibung ein

Honig
quelle
FWIW das ist eine schreckliche, aber praktikable Lösung. Daher behalte ich es.
Honig
Ich habe auch ein Prinzip gesehen, bei dem iOS-Entwickler Stapelansichten zum Erstellen von Diagrammen verwenden. Stackviews sind sehr mächtig
Honey