Swift'de UILabel'de satır aralığı nasıl artırılır


94

Birkaç satırlık metin içeren bir etiketim var ve satırlar arasındaki boşluğu artırmak istiyorum. Başkaları tarafından sorulan benzer sorular var ama çözümler sorunlarımı çözmüyor. Ayrıca etiketim paragraf içerebilir veya içermeyebilir. İçin yeniyim Swift. Film şeridi kullanarak bir çözüm var mı? Yoksa sadece NSAttributedStringmümkün olduğu için mi?

Yanıtlar:


175

UILabelAşağıdaki snippet'i kullanarak programatik olarak LineSpacing ekleyin .

Önceki Swift versiyonu

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

3
Bu, "'NSAttributedString' türündeki değerin 'addAttribute' üyesi yok" hatasını gösterir.
Sneha

2
Onun NSMutableAttributedStringyerine kullanmalıyız NSAttributedString. Asnwer'ı güncelledim.
Dipen Panchasara

1
Özel Yazı Tipleriyle Çalışmak Ayrıca Harika @ Dipen Panchasara
Abdul Karim

7
Nedenini bilmiyorum ama bana gelince, bu sadece
satır aralığı

2
Gerek yok NSMutableAttributedString. KullanabilirNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic

101

Interface Builder'dan:

görüntü açıklamasını buraya girin

Programlı olarak:

SWift 4 ve 4.2

Etiket uzantısını kullanma

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

Şimdi telefon uzantısı işlevi

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

Veya etiket örneğini kullanarak (Sonucu görmek için bu kodu kopyalayıp çalıştırmanız yeterlidir)

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

Hızlı 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

"NSAttributedStringKey.paragraphStyle" hata verdi, bunun yerine "NSParagraphStyleAttributeName" kullandım.
Ahmadreza

@Alfi - Swift dil versiyonunun farkı. Projeniz hızlı bir dil. sürümü hızlı 3.x olabilir ve işte her iki sürüm için yanıtlar. Swift 3 kodu ile deneyin.
Krunal

Hii @krunal, Arabirimde Satır Aralığı ve Satır Yüksekliği ayarladım ve UILabel'de metni Programlı olarak ayarladım ama çalışmıyor. Arayüze metin eklersem o zaman çalışır. Lütfen bana bu konuda yardım edebilir misin Teşekkür ederim ve ben de attributedText ve text'i UILabel'de ayarladım ama bu yaklaşım benim için çalışmıyor.
Yogesh Patel

arabirim oluşturucu çözümü yalnızca statik metin içindir. Koda öznitelikli dizge eklediğimizde, arabirim oluşturucudan eklenen öznitelik uygulanmaz.
Yodagama

66

Satır aralığını kontrol edebilirsiniz storyboard.

görüntü açıklamasını buraya girin

Aynı soru.


8
Aslında bunu denedim. Ama işe yaramıyor. Ayrıca bu, özel yazı tipleri için kullanışlı değildir.
Sneha

Özel yazı tiplerinde yanlış hizalamayla karşılaşıyorsanız, ascenderözelliği burada belirtildiği gibi güncellemeyi deneyin .
pkc456

1
Yanlış hizalama sorunu değil. @ Pkc456
Sneha

Yanlış hizalama sorunu değil. Özel yazı tipimi seçemedim ama şimdi bunu, atıfta bulunan ayarlardan ayrı olarak yazı tipimi ekleyerek çözdüm. Ama yine de aralık aynı kalıyor. @ Pkc456
Sneha

15
Bu yalnızca statik metin içindir. Programlı bir şekilde metin eklemeyi deneyin. Bu işe yaramayacak.
Sneha

11

Swift 5.0 için son çözüm

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
    }

}

Ve kullanım:

let yourLabel = UILabel()
let yourText = "Hello \n world \n !"
yourLabel.text = yourText
yourLabel.addInterlineSpacing(spacingValue: 1.5)

Bu elbette yalnızca kullanıyorsanız UILabel.textve kullanmıyorsanız işe yararUILabel.attributedText
Jeroen

9

Bu yeniden kullanılabilir uzantıyı kullanabilirsiniz:

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

5

Swift 4 ve 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)
    }
}

Nasıl kullanılır

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

Misal


Harika! Zamanımı kurtardım!
Codetard

4

Dipen'in cevabı Swift 4 için güncellendi

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

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
          }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.