Cara Meningkatkan Spasi Baris di UILabel di Swift

94

Saya memiliki label yang memiliki beberapa baris teks dan saya ingin menambah jarak antar baris. Ada pertanyaan serupa yang diajukan oleh orang lain tetapi solusinya tidak menyelesaikan masalah saya. Juga label saya mungkin atau mungkin tidak berisi paragraf. Saya baru mengenal Swift. Apakah ada solusi menggunakan storyboard? Atau hanya melalui NSAttributedStringkemungkinannya?

Sneha
sumber

Jawaban:

175

Secara programatis menambahkan LineSpacing ke UILabelmenggunakan cuplikan berikut.

Versi Swift sebelumnya

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.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.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(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString
Dipen Panchasara
sumber
3
Ini menunjukkan kesalahan "Nilai jenis 'NSAttributedString' tidak memiliki anggota 'addAttribute'".
Sneha
2
Kita perlu menggunakan NSMutableAttributedStringsebagai gantinya NSAttributedString. Saya telah memperbarui asnwer.
Dipen Panchasara
1
Bekerja dengan Font kustom Juga Hebat @ Dipen Panchasara
Abdul Karim
7
Saya tidak tahu mengapa tetapi, bagi saya, ini hanya berfungsi jika Anda menetapkan spasi> = 1, saya mencoba menetapkan 0,5 / 0,75, itu tidak berpengaruh
Aximem
2
Tidak perlu NSMutableAttributedString. Bisa menggunakanNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic
101

Dari Pembuat Antarmuka:

masukkan deskripsi gambar di sini

Secara terprogram:

SWift 4 & 4.2

Menggunakan ekstensi label

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

Sekarang fungsi ekstensi panggilan

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

Atau menggunakan contoh label (Cukup salin & jalankan kode ini untuk melihat hasilnya)

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

Cepat 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
sumber
"NSAttributedStringKey.paragraphStyle" mengalami error, saya menggunakan "NSParagraphStyleAttributeName" sebagai gantinya.
Ahmadreza
@Alfi - Ini perbedaan versi bahasa Swift. Lang cepat proyek Anda. versi mungkin cepat 3.x dan berikut adalah jawaban untuk kedua versi. Coba dengan kode Swift 3.
Krunal
Hai @krunal, saya telah mengatur Linespacing dan LineHeight di Interface dan saya mengatur teks dalam UILabel secara terprogram tetapi tidak berfungsi. jika saya menambahkan teks di Interface maka itu berhasil. bisakah Anda membantu saya untuk ini Terima kasih dan saya juga mengatur atributedText dan teks dalam UILabel tetapi pendekatan itu tidak berhasil untuk saya.
Yogesh Patel
solusi pembuat antarmuka hanya untuk teks statis. ketika kita menambahkan string yang diatribusikan dalam kode, atribut tersebut yang ditambahkan dari pembuat antarmuka tidak diterapkan.
Yodagama
66

Anda dapat mengontrol spasi dalam storyboard.

masukkan deskripsi gambar di sini

Pertanyaan yang sama.

pkc456.dll
sumber
8
Saya benar-benar mencoba ini. Tapi itu tidak berhasil. Juga ini tidak berguna untuk font khusus.
Sneha
Jika Anda menghadapi ketidaksejajaran dalam font kustom, coba perbarui ascenderproperti seperti yang disebutkan di sini .
pkc456
1
Ini bukan masalah mis-alignment. Saya tidak dapat memilih font khusus saya dengan solusi yang Anda katakan @ pkc456
Sneha
Ini bukan masalah mis-alignment. Saya tidak dapat memilih font khusus saya, tetapi sekarang saya menyelesaikannya dengan menambahkan Font saya melalui pengaturan secara terpisah di Attributed. Tapi jaraknya tetap sama. @ Pkc456
Sneha
15
Ini hanya untuk teks statis. Coba tambahkan teks secara programatticaly. Ini tidak akan berhasil.
Sneha
11

Solusi terbaru untuk 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
    }

}

Dan penggunaannya:

let yourLabel = UILabel()
let yourText = "Hello \n world \n !"
yourLabel.text = yourText
yourLabel.addInterlineSpacing(spacingValue: 1.5)
Alexander Nikolenko
sumber
Ini tentu saja hanya akan bekerja jika Anda menggunakan UILabel.textdan tidakUILabel.attributedText
Jeroen
9

Anda dapat menggunakan ekstensi yang dapat digunakan kembali ini:

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
sumber
5

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

Cara Penggunaan

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

Contoh

Rashid Latif
sumber
Keangkeran! Menghemat waktu saya!
Codetard
4

Jawaban Dipen diperbarui untuk 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
sumber
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
sumber