Respostas:
Edit: Evidentemente NSAttributedString
vai fazer isso, no iOS 6 e posterior. Em vez de usar um NSString
para definir o texto do rótulo, crie um NSAttributedString
, defina atributos nele e, em seguida, defina-o como .attributedText
no rótulo. O código que você deseja será mais ou menos assim:
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;
Old attributedStringWithString de NSAttributedString fez a mesma coisa, mas agora que está sendo preterido.
Por razões históricas, aqui está minha resposta original:
Resposta curta: você não pode. Para alterar o espaçamento entre as linhas de texto, você terá que criar uma subclasse UILabel
e drawTextInRect
criar seu próprio , criar vários rótulos ou usar uma fonte diferente (talvez uma editada para uma altura de linha específica, veja a resposta de Phillipe).
Resposta longa: no mundo impresso e online, o espaço entre as linhas do texto é conhecido como "líder" (rima com 'cabeçalho' e vem do metal de chumbo usado décadas atrás). Leading é uma propriedade somente leitura de UIFont
, que foi descontinuada no 4.0 e substituída por lineHeight
. Até onde eu sei, não há como criar uma fonte com um conjunto específico de parâmetros, como lineHeight
; você obtém as fontes do sistema e qualquer fonte personalizada que adicionar, mas não pode ajustá-las depois de instaladas.
Também não há parâmetro de espaçamento em UILabel
.
Não estou particularmente feliz com UILabel
o comportamento de, então, sugiro escrever sua própria subclasse ou usar uma biblioteca de terceiros. Isso tornará o comportamento independente da escolha da fonte e será a solução mais reutilizável.
Eu gostaria que foi mais flexibilidade na UILabel
, e eu ficaria feliz em estar errado comprovada!
A partir do iOS 6, você pode definir uma string atribuída no 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
desabilita, por exemplo, o alinhamento do texto do rótulo, então você tem que adicioná-lo ao estilo de parágrafo.
Você pode controlar o espaçamento entre linhas no storyboard:
Do Interface Builder:
Programaticamente:
SWift 4
Usando extensão de rótulo
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
}
}
Agora chame a função de extensão
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
Ou usando a instância do rótulo (basta copiar e executar este código para ver o 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
Minha solução foi corrigir o próprio arquivo de fonte e fixar definitivamente a altura da linha. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/
Tive que modificar 'lineGap', 'ascender', 'descender' no bloco 'hhea' (como no exemplo do blog).
Esse cara criou uma classe para obter a altura da linha (sem usar CoreText, como biblioteca MTLabel): https://github.com/LemonCake/MSLabel
A melhor coisa que encontrei é: https://github.com/mattt/TTTAttributedLabel
É uma subclasse UILabel, então você pode simplesmente inseri-la e, em seguida, alterar a altura da linha:
myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
Encontrei bibliotecas de terceiros como esta:
https://github.com/Tuszy/MTLabel
Para ser a solução mais fácil.
Aqui está um código rápido para você definir o espaçamento de linha de forma programática
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
Claro, a resposta de Mike não funciona se você passar a string programaticamente. Neste caso você precisa passar uma string atribuída e mudar seu 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;