Respuestas:
Editar: Evidentemente NSAttributedString
lo hará, en iOS 6 y posteriores. En lugar de usar un NSString
para establecer el texto de la etiqueta, cree un NSAttributedString
, establezca atributos en él y luego configúrelo como .attributedText
en 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 UILabel
y 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 UILabel
el 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!
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 ;
AttributedString
deshabilita, por ejemplo, la alineación del texto de la etiqueta, por lo que debe agregarlo al estilo de párrafo.
Puede controlar el espaciado de línea en el guión gráfico:
Desde Interface Builder:
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
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).
Este chico creó una clase para obtener la altura de la línea (sin usar CoreText, como biblioteca MTLabel): https://github.com/LemonCake/MSLabel
Lo mejor que encontré es: https://github.com/mattt/TTTAttributedLabel
Es una subclase de UILabel, por lo que puede colocarla y luego cambiar la altura de la línea:
myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
Encontré bibliotecas de terceros como esta:
https://github.com/Tuszy/MTLabel
Ser la solución más sencilla.
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
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;