ios objective-c uilabel multiline line-spacing

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




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;



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;



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!