ios - Establecer el espaciado de línea UILabel
objective-c multiline (10)
A partir de ios 6 puede establecer una cadena atribuida en el 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 ;
¿Cómo puedo modificar el espacio entre líneas (espacio entre líneas) en una UILabel
líneas UILabel
?
Aquí hay un código rápido para que establezca el espaciado entre líneas 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
Encontré Bibliotecas de terceros como esta:
https://github.com/Tuszy/MTLabel
Para ser la solución más fácil.
Este chico creó una clase para obtener la altura de línea (sin utilizar CoreText, como biblioteca MTLabel): https://github.com/LemonCake/MSLabel
Lo mejor que encontré es: https://github.com/mattt/TTTAttributedLabel
Es una subclase UILabel, así que puede simplemente colocarla y luego cambiar la altura de la línea:
myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
Mi solución fue parchear el archivo de fuente y fijar definitivamente su altura de línea. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/
Tuve que modificar ''lineGap'', ''ascendente'', ''descendiente'' en el bloque ''hhea'' (como en el ejemplo del blog).
Por supuesto, la respuesta de Mike no funciona si pasas la cadena programáticamente. 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;
Puede controlar el espaciado entre líneas en el guión gráfico:
Desde Interface Builder:
Programado:
SWIFT 4
Usando la 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 la instancia de etiqueta (solo 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
Editar: Evidentemente, NSAttributedString
lo hará, en iOS 6 y versiones posteriores. En lugar de usar un NSString
para establecer el texto de la etiqueta, cree un NSAttributedString
, establezca los atributos en él, luego NSAttributedString
como NSAttributedString
en la etiqueta. El código que quieres 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;
El antiguo attributeStringWithString de NSAttributedString hizo lo mismo, pero ahora está en desuso.
Por razones históricas, esta es mi respuesta original:
Respuesta corta: no puedes. Para cambiar el espacio entre líneas de texto, deberá subclase UILabel
y desplegar su propio drawTextInRect
, crear varias etiquetas o utilizar una fuente diferente (tal vez una editada para una altura de línea específica, ver la respuesta de Phillipe).
Respuesta larga: en el mundo impreso y en línea, el espacio entre líneas de texto se conoce como "líder" (rima con "encabezado") y proviene del metal de plomo utilizado hace décadas). Liderar es una propiedad de solo lectura de UIFont
, que fue desaprobada 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
; obtienes las fuentes del sistema y cualquier fuente personalizada que agregues, pero no puedes modificarlas una vez instaladas.
No hay parámetro de espaciado en UILabel
, tampoco.
No estoy particularmente contento con el comportamiento de UILabel
tal como está, por lo que sugiero escribir su propia subclase o utilizar una biblioteca de terceros. Eso hará que el comportamiento sea independiente de la elección de tu fuente y será la solución más reutilizable.
¡Ojalá hubiera más flexibilidad en UILabel
, y estaría feliz de haber demostrado que estaba equivocado!