Como aumentar o espaçamento entre linhas em UILabel em Swift

93

Tenho uma etiqueta com poucas linhas de texto e desejo aumentar o espaçamento entre as linhas. Há perguntas semelhantes feitas por outras pessoas, mas as soluções não resolvem meus problemas. Além disso, meu rótulo pode ou não conter parágrafos. Eu sou novo Swift. Existe uma solução usando storyboard? Ou apenas através do NSAttributedStringseu possível?

Sneha
fonte

Respostas:

171

Adicione LineSpacing programaticamente ao seu UILabelusando o seguinte trecho.

Versão Swift anterior

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.0

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.2

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString
Dipen Panchasara
fonte
3
Isso mostra um erro "O valor do tipo 'NSAttributedString' não tem membro 'addAttribute'".
Sneha
2
Precisamos usar em seu NSMutableAttributedStringlugar NSAttributedString. Eu atualizei uma resposta.
Dipen Panchasara
1
Trabalhar com fontes personalizadas também é ótimo @ Dipen Panchasara
Abdul Karim
7
Não sei por que, mas, quanto a mim, isso só funciona se você definir espaçamento entre linhas> = 1, tentei definir 0,5 / 0,75, não surtiu efeito
Aximem
1
Não há necessidade NSMutableAttributedString. Pode usarNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic
99

Do Interface Builder:

insira a descrição da imagem aqui

Programaticamente:

SWift 4 e 4.2

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

        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))


        // (Swift 4.1 and 4.0) 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 = "Set\nUILabel\nline\nspacing"

// 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
Krunal
fonte
"NSAttributedStringKey.paragraphStyle" tinha um erro, usei "NSParagraphStyleAttributeName" no lugar.
Ahmadreza
@Alfi - É a diferença da versão da linguagem Swift. Idioma rápido do seu projeto. a versão pode ser rápida 3.xe aqui estão as respostas para ambas as versões. Tente com o código Swift 3.
Krunal
Hii @krunal, Eu configurei Linespacing e LineHeight na Interface e configurei texto em UILabel programaticamente, mas não está funcionando. se eu adicionar texto na Interface, então funciona. você pode me ajudar com isso Obrigado e eu também configurei o texto atribuído e o texto em UILabel, mas essa abordagem não está funcionando para mim.
Yogesh Patel
A solução do construtor de interface é apenas para texto estático. quando adicionamos string atribuída no código, aqueles atributos que são adicionados do construtor de interface não são aplicados.
Yodagama,
66

Você pode controlar o espaçamento entre linhas storyboard.

insira a descrição da imagem aqui

Mesma questão.

pkc456
fonte
8
Na verdade, eu tentei isso. Mas não está funcionando. Além disso, isso não é útil para fontes personalizadas.
Sneha
Se você estiver enfrentando desalinhamento em fontes personalizadas, tente atualizar a ascenderpropriedade conforme mencionado aqui .
pkc456
1
Não é problema de desalinhamento. Não consigo selecionar minha fonte personalizada com a solução que você disse @ pkc456
Sneha
Não é problema de desalinhamento. Não consegui selecionar minha fonte personalizada. Mas agora resolvi isso adicionando minha fonte por meio de configurações separadamente em Atribuído. Mas o espaçamento continua o mesmo. @ Pkc456
Sneha
15
Isso é apenas para texto estático. Tente adicionar texto programaticamente. Isso não vai funcionar.
Sneha de
9

Você pode usar esta extensão reutilizável:

extension String {

func lineSpaced(_ spacing: CGFloat) -> NSAttributedString {
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = spacing
    let attributedString = NSAttributedString(string: self, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])
    return attributedString
}
}
Hossam Ghareeb
fonte
9

Solução recente para Swift 5.0

private extension UILabel {

    // MARK: - spacingValue is spacing that you need
    func addInterlineSpacing(spacingValue: CGFloat = 2) {

        // MARK: - Check if there's any text
        guard let textString = text else { return }

        // MARK: - Create "NSMutableAttributedString" with your text
        let attributedString = NSMutableAttributedString(string: textString)

        // MARK: - Create instance of "NSMutableParagraphStyle"
        let paragraphStyle = NSMutableParagraphStyle()

        // MARK: - Actually adding spacing we need to ParagraphStyle
        paragraphStyle.lineSpacing = spacingValue

        // MARK: - Adding ParagraphStyle to your attributed String
        attributedString.addAttribute(
            .paragraphStyle,
            value: paragraphStyle,
            range: NSRange(location: 0, length: attributedString.length
        ))

        // MARK: - Assign string that you've modified to current attributed Text
        attributedText = attributedString
    }

}

E o uso:

let yourLabel = UILabel()
let yourText = "Hello \n world \n !"
yourLabel.text = yourText
yourLabel.addInterlineSpacing(spacingValue: 1.5)
Alexander Nikolenko
fonte
É claro que isso só funcionará se você estiver usando UILabel.texte nãoUILabel.attributedText
JeroenJK
4

Resposta de Dipen atualizada para Swift 4

let attr = NSMutableAttributedString(string: today)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2
attr.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attr.length))
label.attributedText = attr;
Mike Carpenter
fonte
4

Swift 4 e Swift 5

extension NSAttributedString {
    func withLineSpacing(_ spacing: CGFloat) -> NSAttributedString {


        let attributedString = NSMutableAttributedString(attributedString: self)
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = .byTruncatingTail
        paragraphStyle.lineSpacing = spacing
        attributedString.addAttribute(.paragraphStyle,
                                      value: paragraphStyle,
                                      range: NSRange(location: 0, length: string.count))
        return NSAttributedString(attributedString: attributedString)
    }
}

Como usar

    let example = NSAttributedString(string: "This is Line 1 \nLine 2 \nLine 3 ").withLineSpacing(15)
    testLabel.attributedText = example

Exemplo

Rashid Latif
fonte
Maravilha! Economizei meu tempo!
Codetard
1
//Swift 4:
    func set(text:String,
                         inLabel:UILabel,
                         withLineSpacing:CGFloat,
                         alignment:NSTextAlignment){
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = withLineSpacing
            let attrString = NSMutableAttributedString(string: text)
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle,
                                    value:paragraphStyle,
                                    range:NSMakeRange(0, attrString.length))
            inLabel.attributedText = attrString
            inLabel.textAlignment = alignment
          }
Venu Gopal Tewari
fonte