So erhöhen Sie den Zeilenabstand in UILabel in Swift


91

Ich habe eine Beschriftung mit wenigen Textzeilen und möchte den Abstand zwischen den Zeilen vergrößern. Es gibt ähnliche Fragen, die von anderen gestellt werden, aber die Lösungen lösen meine Probleme nicht. Auch mein Etikett kann Absätze enthalten oder nicht. Ich bin neu in Swift. Gibt es eine Lösung mit Storyboard? Oder nur durch NSAttributedStringseine Möglichkeit?

Antworten:


168

Fügen Sie Ihrem UILabelfolgenden Snippet programmgesteuert LineSpacing hinzu .

Frühere Swift-Version

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.0

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.2

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

3
Dies zeigt einen Fehler "Wert vom Typ 'NSAttributedString' hat kein Mitglied 'addAttribute'".
Sneha

2
Wir müssen NSMutableAttributedStringstattdessen verwenden NSAttributedString. Ich habe asnwer aktualisiert.
Dipen Panchasara

1
Arbeiten Sie mit benutzerdefinierten Schriftarten Auch Great @ Dipen Panchasara
Abdul Karim

7
Ich weiß nicht warum, aber für mich funktioniert dies nur, wenn Sie den Zeilenabstand> = 1 einstellen. Ich habe versucht, 0,5 / 0,75 einzustellen. Es hat keine Auswirkung
Aximem

1
Keine Notwendigkeit für NSMutableAttributedString. Kann verwendenNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic

99

Vom Interface Builder:

Geben Sie hier die Bildbeschreibung ein

Programmatisch:

SWift 4 & 4.2

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

        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))


        // (Swift 4.1 and 4.0) 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 = "Set\nUILabel\nline\nspacing"

// 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

"NSAttributedStringKey.paragraphStyle" hatte einen Fehler, ich habe stattdessen "NSParagraphStyleAttributeName" verwendet.
Alfi

@ Alfi - Es ist ein Unterschied zur Swift-Sprachversion. Die schnelle Sprache Ihres Projekts. Version kann schnell 3.x sein und hier sind Antworten für beide Versionen. Versuchen Sie es mit Swift 3-Code.
Krunal

Hii @krunal, ich habe Linespacing und LineHeight in Interface festgelegt und Text in UILabel programmatisch festgelegt, aber es funktioniert nicht. Wenn ich Text in Interface hinzufüge, funktioniert es. Kannst du mir bitte dabei helfen? Danke und ich habe auch den Attributtext und den Text in UILabel festgelegt, aber dieser Ansatz funktioniert bei mir nicht.
Yogesh Patel

Die Interface Builder-Lösung ist nur für statischen Text geeignet. Wenn wir dem Code eine zugeordnete Zeichenfolge hinzufügen, werden die Attribute, die vom Interface Builder hinzugefügt werden, nicht angewendet.
Yodagama

65

Sie können den Zeilenabstand in steuern storyboard.

Geben Sie hier die Bildbeschreibung ein

Selbe Frage.


8
Ich habe es tatsächlich versucht. Aber es funktioniert nicht. Dies ist auch für benutzerdefinierte Schriftarten nicht hilfreich.
Sneha

Wenn bei benutzerdefinierten Schriftarten eine Fehlausrichtung auftritt, versuchen Sie, die ascenderEigenschaft wie hier beschrieben zu aktualisieren .
pkc456

1
Es ist kein Problem der Fehlausrichtung. Ich kann meine benutzerdefinierte Schriftart nicht mit der Lösung auswählen, die Sie @ pkc456
Sneha

Es ist kein Problem der Fehlausrichtung. Ich konnte meine benutzerdefinierte Schriftart nicht auswählen. Aber jetzt habe ich das gelöst, indem ich meine Schriftart durch Einstellungen separat in Attributed hinzugefügt habe. Aber der Abstand bleibt immer noch der gleiche. @ Pkc456
Sneha

15
Dies gilt nur für statischen Text. Versuchen Sie, Textprogramme hinzuzufügen. Das wird nicht funktionieren.
Sneha

9

Sie können diese wiederverwendbare Erweiterung verwenden:

extension String {

func lineSpaced(_ spacing: CGFloat) -> NSAttributedString {
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = spacing
    let attributedString = NSAttributedString(string: self, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])
    return attributedString
}
}

8

Aktuelle Lösung für Swift 5.0

private extension UILabel {

    // MARK: - spacingValue is spacing that you need
    func addInterlineSpacing(spacingValue: CGFloat = 2) {

        // MARK: - Check if there's any text
        guard let textString = text else { return }

        // MARK: - Create "NSMutableAttributedString" with your text
        let attributedString = NSMutableAttributedString(string: textString)

        // MARK: - Create instance of "NSMutableParagraphStyle"
        let paragraphStyle = NSMutableParagraphStyle()

        // MARK: - Actually adding spacing we need to ParagraphStyle
        paragraphStyle.lineSpacing = spacingValue

        // MARK: - Adding ParagraphStyle to your attributed String
        attributedString.addAttribute(
            .paragraphStyle,
            value: paragraphStyle,
            range: NSRange(location: 0, length: attributedString.length
        ))

        // MARK: - Assign string that you've modified to current attributed Text
        attributedText = attributedString
    }

}

Und die Verwendung:

let yourLabel = UILabel()
let yourText = "Hello \n world \n !"
yourLabel.text = yourText
yourLabel.addInterlineSpacing(spacingValue: 1.5)

4

Dipens Antwort für Swift 4 aktualisiert

let attr = NSMutableAttributedString(string: today)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2
attr.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attr.length))
label.attributedText = attr;

4

Swift 4 und Swift 5

extension NSAttributedString {
    func withLineSpacing(_ spacing: CGFloat) -> NSAttributedString {


        let attributedString = NSMutableAttributedString(attributedString: self)
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = .byTruncatingTail
        paragraphStyle.lineSpacing = spacing
        attributedString.addAttribute(.paragraphStyle,
                                      value: paragraphStyle,
                                      range: NSRange(location: 0, length: string.count))
        return NSAttributedString(attributedString: attributedString)
    }
}

Wie benutzt man

    let example = NSAttributedString(string: "This is Line 1 \nLine 2 \nLine 3 ").withLineSpacing(15)
    testLabel.attributedText = example

Beispiel


Großartigkeit! Hat mir Zeit gespart!
Codetard

1
//Swift 4:
    func set(text:String,
                         inLabel:UILabel,
                         withLineSpacing:CGFloat,
                         alignment:NSTextAlignment){
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = withLineSpacing
            let attrString = NSMutableAttributedString(string: text)
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle,
                                    value:paragraphStyle,
                                    range:NSMakeRange(0, attrString.length))
            inLabel.attributedText = attrString
            inLabel.textAlignment = alignment
          }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.