Cómo aumentar el espaciado de línea en UILabel en Swift


94

Tengo una etiqueta que tiene pocas líneas de texto y quiero aumentar el espacio entre las líneas. Hay preguntas similares hechas por otros, pero las soluciones no resuelven mis problemas. Además, mi etiqueta puede contener párrafos o no. Soy nuevo en Swift. ¿Existe una solución usando storyboard? ¿O solo a través de NSAttributedStringsu posible?

Respuestas:


175

Agregue de manera programada LineSpacing a su UILabeluso del siguiente fragmento.

Versión Swift anterior

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

Rápido 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
Esto muestra un error "El valor de tipo 'NSAttributedString' no tiene miembro 'addAttribute'".
Sneha

2
Necesitamos usar NSMutableAttributedStringen su lugar NSAttributedString. He actualizado una respuesta.
Dipen Panchasara

1
Trabajar con fuentes personalizadas también es genial @ Dipen Panchasara
Abdul Karim

7
No sé por qué, pero, en lo que a mí respecta, esto solo funciona si establece el espacio entre líneas> = 1, intenté establecer 0.5 / 0.75, no tiene ningún efecto
Aximem

2
No es necesario NSMutableAttributedString. Puede usarNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic

101

Desde Interface Builder:

ingrese la descripción de la imagen aquí

Programáticamente:

SWift 4 y 4.2

Usando extensión de etiqueta

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

Ahora llame a la función de extensión

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 una instancia de etiqueta (simplemente copie y ejecute este código para ver el resultado)

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" tenía un error, utilicé "NSParagraphStyleAttributeName" en su lugar.
Ahmadreza

@Alfi - Es la diferencia de la versión de idioma Swift. El lenguaje rápido de su proyecto. la versión puede ser rápida 3.xy aquí hay respuestas para ambas versiones. Prueba con el código Swift 3.
Krunal

Hola @krunal, configuré el espacio entre líneas y LineHeight en la interfaz y configuré el texto en UILabel mediante programación, pero no funciona. si agrego texto en la interfaz, entonces funciona. ¿Pueden ayudarme con esto? Gracias y también establecí texto y texto atribuidos en UILabel, pero ese enfoque no me funciona.
Yogesh Patel

La solución de creación de interfaces es solo para texto estático. cuando agregamos una cadena de atributos en el código, los atributos que se agregan desde el generador de interfaces no se aplican.
Yodagama

66

Puede controlar el interlineado storyboard.

ingrese la descripción de la imagen aquí

La misma pregunta.


8
De hecho probé esto. Pero no funciona. Además, esto no es útil para fuentes personalizadas.
Sneha

Si tiene problemas de alineación en las fuentes personalizadas, intente actualizar la ascenderpropiedad como se menciona aquí .
pkc456

1
No es un problema de desalineación. No puedo seleccionar mi fuente personalizada con la solución que dijiste @ pkc456
Sneha

No es un problema de desalineación. No pude seleccionar mi fuente personalizada. Pero ahora lo resolví agregando mi fuente a través de la configuración por separado en Attributed. Pero el espaciado sigue siendo el mismo. @ Pkc456
Sneha

15
Esto es solo para texto estático. Intente agregar texto de manera programada. Esto no funcionará.
Sneha

11

Solución reciente para 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
    }

}

Y el uso:

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

Por supuesto, esto solo funcionará si está usando UILabel.texty noUILabel.attributedText
Jeroen

9

Puede utilizar esta extensión reutilizable:

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

Cómo utilizar

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

Ejemplo


¡Genialidad! ¡Me salvó el tiempo!
Codetard

4

Respuesta de Dipen actualizada para 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
          }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.