Come aumentare la spaziatura delle righe in UILabel in Swift


94

Ho un'etichetta che ha poche righe di testo e voglio aumentare la spaziatura tra le righe. Ci sono domande simili poste da altri ma le soluzioni non risolvono i miei problemi. Anche la mia etichetta può o non può contenere paragrafi. Sono nuovo a Swift. Esiste una soluzione utilizzando lo storyboard? O solo attraverso il NSAttributedStringsuo possibile?

Risposte:


175

Aggiungi in modo programmatico LineSpacing al UILabelseguente frammento di codice .

Versione precedente di Swift

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
Viene visualizzato un errore "Il valore di tipo" NSAttributedString "non ha membri" addAttribute "".
Sneha

2
Dobbiamo NSMutableAttributedStringinvece usare NSAttributedString. Ho aggiornato una risposta.
Dipen Panchasara

1
Lavora con caratteri personalizzati anche fantastici @ Dipen Panchasara
Abdul Karim

7
Non so perché ma, per quanto mi riguarda, funziona solo se imposti interlinea> = 1, ho provato a impostare 0,5 / 0,75, non ha alcun effetto
Aximem

2
Non ce n'è bisogno NSMutableAttributedString. Può usareNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic

101

Da Interface Builder:

inserisci qui la descrizione dell'immagine

A livello di codice:

SWift 4 e 4.2

Utilizzo dell'estensione dell'etichetta

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

Ora chiama la funzione di estensione

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

O usando l'istanza dell'etichetta (basta copiare ed eseguire questo codice per vedere il risultato)

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" ha avuto un errore, ho usato invece "NSParagraphStyleAttributeName".
Ahmadreza

@Alfi - È la differenza della versione in lingua Swift. La lingua rapida del tuo progetto. la versione può essere rapida 3.x e qui ci sono le risposte per entrambe le versioni. Prova con il codice Swift 3.
Krunal

Ciao @krunal, ho impostato Linespacing e LineHeight in Interface e ho impostato il testo in UILabel a livello di programmazione ma non funziona. se aggiungo del testo in Interface, allora funziona. puoi per favore aiutarmi per questo grazie e ho anche impostato il testo e il testo attribuiti in UILabel ma questo approccio non funziona per me.
Yogesh Patel

La soluzione per la creazione di interfacce è solo per testo statico. quando aggiungiamo una stringa attribuita nel codice, quegli attributi aggiunti dal generatore di interfacce non vengono applicati.
Yodagama

66

Puoi controllare l'interlinea in storyboard.

inserisci qui la descrizione dell'immagine

Stessa domanda.


8
In realtà l'ho provato. Ma non funziona. Anche questo non è utile per i caratteri personalizzati.
Sneha

Se stai riscontrando un disallineamento nei caratteri personalizzati, prova ad aggiornare la ascenderproprietà come menzionato qui .
pkc456

1
Non è un problema di disallineamento. Non riesco a selezionare il mio carattere personalizzato con la soluzione che hai detto @ pkc456
Sneha

Non è un problema di disallineamento. Non riuscivo a selezionare il mio carattere personalizzato, ma ora l'ho risolto aggiungendo il mio carattere separatamente tramite le impostazioni in Attribuito. Ma la spaziatura rimane la stessa. @ Pkc456
Sneha

15
Questo è solo per il testo statico. Prova ad aggiungere un programma di testo in modo particolare. Questo non funzionerà.
Sneha

11

Soluzione recente per 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
    }

}

E l'utilizzo:

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

Questo ovviamente funzionerà solo se stai usando UILabel.texte nonUILabel.attributedText
Jeroen

9

Puoi usare questa estensione riutilizzabile:

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

5

Swift 4 e 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)
    }
}

Come usare

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

Esempio


Grandiosità! Mi ha fatto risparmiare tempo!
Codetard

4

Risposta di Dipen aggiornata per Swift 4

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

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
          }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.