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?

Sneha
quelle

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
Dipen Panchasara
quelle
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
Krunal
quelle
"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.

pkc456
quelle
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
}
}
Hossam Ghareeb
quelle
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)
Alexander Nikolenko
quelle
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;
Mike Carpenter
quelle
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

Rashid Latif
quelle
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
          }
Venu Gopal Tewari
quelle