Establecer el espaciado de línea UILabel

Respuestas:

122

Editar: Evidentemente NSAttributedStringlo hará, en iOS 6 y posteriores. En lugar de usar un NSStringpara establecer el texto de la etiqueta, cree un NSAttributedString, establezca atributos en él y luego configúrelo como .attributedTexten la etiqueta. El código que desea será algo como esto:

NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:@"Sample text"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attrString addAttribute:NSParagraphStyleAttributeName
    value:style
    range:NSMakeRange(0, strLength)];
uiLabel.attributedText = attrString;

AttributedStringWithString edad de NSAttributedString hizo lo mismo, pero ahora que está en desuso.

Por razones históricas, aquí está mi respuesta original:

Respuesta corta: no puedes. Para cambiar el espaciado entre líneas de texto, tendrá que crear una subclase UILabely enrollar el suyo drawTextInRect, crear varias etiquetas o usar una fuente diferente (tal vez una editada para una altura de línea específica, consulte la respuesta de Phillipe).

Respuesta larga: en el mundo impreso y en línea, el espacio entre líneas de texto se conoce como "interlineado" (rima con "título" y proviene del metal de plomo utilizado hace décadas). Leading es una propiedad de solo lectura de UIFont, que fue obsoleta en 4.0 y reemplazada por lineHeight. Hasta donde yo sé, no hay forma de crear una fuente con un conjunto específico de parámetros como lineHeight; obtiene las fuentes del sistema y cualquier fuente personalizada que agregue, pero no puede modificarlas una vez instaladas.

Tampoco hay ningún parámetro de espaciado UILabel.

No estoy particularmente contento con UILabelel comportamiento de este, por lo que sugiero que escriba su propia subclase o use una biblioteca de terceros. Eso hará que el comportamiento sea independiente de su elección de fuente y será la solución más reutilizable.

Me gustaría que era más flexibilidad en UILabel, y yo estaría feliz de estar equivocado probada!

AndrewS
fuente
1
Lo he hecho subclasificando UILabel, básicamente la idea es dividir el texto de la etiqueta en tokens, y luego la longitud de identidad de cada token, crear una etiqueta separada para cada token y agregar uno tras otro. Eso es.
Matrix
3
¡Mentiras! ;) Puede parchear un archivo de fuente para cambiar la altura de la línea; vea mi respuesta en esta página.
Philippe
Me hacen creer que hay una manera de hacer esto con NSAttributedString. Si necesita etiquetas con cadenas atribuidas en versiones anteriores a iOS 6, consulte OHAttributedLabel .
Spencer Williams
Hágalo con NSAttributesString si usa iOS> = 6. Ejemplo
d.ennis
Esto es simple y funciona bien.
R. Mohan
75

A partir de ios 6, puede establecer una cadena con atributos en UILabel:

NSString *labelText = @"some text"; 
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:40];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
cell.label.attributedText = attributedString ;
iosMentalista
fuente
1
¡Gracias! Agregaría que el uso de AttributedStringdeshabilita, por ejemplo, la alineación del texto de la etiqueta, por lo que debe agregarlo al estilo de párrafo.
cyborg86pl
56

Puede controlar el espaciado de línea en el guión gráfico:

pregunta duplicada

Mike S
fuente
10
Sin embargo, en Xcode 6.1.1, seleccionar la etiqueta y cambiar el valor de la línea en el panel de atributos hará que el panel parpadee y bloquee la aplicación. Solo he podido salir del panel forzando la salida de Xcode.
izk
4
Aprobado
1
En la versión 7.1, el panel parpadea y no tiene ningún efecto en el tiempo de ejecución. Tenía que hacerlo en código.
MiguelSlv
440 vatios de electricidad
pasaron
23

Desde Interface Builder:

ingrese la descripción de la imagen aquí

Programáticamente:

Rápido 4

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

        // 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 = "How to\ncontrol\nthe\nline spacing\nin UILabel"

// 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
Necesito pasar solo una línea de argumento Espaciado o altura de línea múltiple, no se pueden pasar ambos argumentos, de lo contrario, creo que no habrá ningún resultado
Arpit B Parekh
16

Mi solución fue parchear el archivo de fuente y arreglar definitivamente su altura de línea. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

Tuve que modificar 'lineGap', 'ascender', 'descender' en el bloque 'hhea' (como en el ejemplo del blog).

Philippe
fuente
¡Super guay! Esas herramientas de fuentes de OS X también funcionaron para mi fuente OTF (aunque solo especifica TTF ...). Mi fuente tenía una altura de línea de 1000 (!), La cambié a 0 y listo. Tenía millas y millas de espacio vacío debajo del texto en cada línea.
Jonny
2
No puedo creer que esta sea la mejor solución (¡no te ofendas!), Pero es de lejos la más simple. Utilicé el software gratuito (Windows) Type Light (y en Font | Metrics | Advanced puedes modificar lineGap) para editar mis fuentes. También te permite "cambiar el nombre" de las fuentes, lo que no pude averiguar cómo hacerlo con la herramienta que mencionó Philippe.
Kirk Woll
¡Esto es fantástico @Philippe! ¡¡Gracias por la publicacion!!
Robbie
También vea mi respuesta a una pregunta similar para obtener más detalles: stackoverflow.com/a/19553827/201828
phatmann
@iamjustaprogrammer Está en línea nuevamente.
Matt B.
2

Aquí hay un código rápido para que establezca el interlineado mediante programación

let label = UILabel()

let attributedText = NSMutableAttributedString(string: "Your string")
let paragraphStyle = NSMutableParagraphStyle()

//SET THIS:
paragraphStyle.lineSpacing = 4
//OR SET THIS:
paragraphStyle.lineHeightMultiple = 4

//Or set both :)

let range = NSMakeRange(0, attributedText.length)
attributedText.addAttributes([NSParagraphStyleAttributeName : paragraphStyle], range: range)
label.attributedText = attributedText
ullstrm
fuente
0

Por supuesto, la respuesta de Mike no funciona si pasa la cadena mediante programación. En este caso, debe pasar una cadena atribuida y cambiar su estilo.

NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;
Ricardo Mutti
fuente