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?

Sneha
fuente

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

pkc456
fuente
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)
Alexander Nikolenko
fuente
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
}
}
Hossam Ghareeb
fuente
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

Rashid Latif
fuente
¡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;
Mike Carpenter
fuente
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
fuente