Atur spasi baris UILabel

Jawaban:

122

Sunting: Tampaknya NSAttributedStringakan melakukannya, di iOS 6 dan lebih baru. Daripada menggunakan NSStringuntuk menyetel teks label, buat NSAttributedString, setel atribut di atasnya, lalu setel sebagai .attributedTextdi label. Kode yang Anda inginkan akan menjadi seperti ini:

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;

AttributedStringWithString tua NSAttributedString ini melakukan hal yang sama, tapi sekarang yang sedang ditinggalkan.

Untuk alasan historis, inilah jawaban asli saya:

Jawaban singkatnya: Anda tidak bisa. Untuk mengubah jarak antar baris teks, Anda harus membuat subkelas UILabeldan menggulung sendiri drawTextInRect, membuat beberapa label, atau menggunakan font yang berbeda (mungkin yang diedit untuk tinggi baris tertentu, lihat jawaban Phillipe).

Jawaban panjang: Dalam dunia cetak dan online, spasi antar baris teks dikenal sebagai "leading" (berima dengan 'heading', dan berasal dari logam utama yang digunakan puluhan tahun lalu). Memimpin adalah properti hanya-baca UIFont, yang tidak digunakan lagi di 4.0 dan diganti oleh lineHeight. Sejauh yang saya tahu, tidak ada cara untuk membuat font dengan sekumpulan parameter tertentu seperti lineHeight; Anda mendapatkan font sistem dan font khusus apa pun yang Anda tambahkan, tetapi tidak dapat men-tweaknya setelah diinstal.

Tidak ada parameter spasi di UILabeljuga.

Saya tidak terlalu senang dengan UILabelperilaku apa adanya, jadi saya sarankan untuk menulis subkelas Anda sendiri atau menggunakan perpustakaan pihak ketiga. Itu akan membuat perilaku tidak bergantung pada pilihan font Anda dan menjadi solusi yang paling dapat digunakan kembali.

Saya berharap ada adalah lebih banyak fleksibilitas dalam UILabel, dan saya akan senang untuk menjadi terbukti salah!

AndrewS
sumber
1
Saya telah melakukannya dengan sub-classing UILabel, pada dasarnya idenya adalah membagi teks label menjadi token, dan kemudian identitas panjang setiap token, membuat label terpisah untuk setiap token dan menambahkan satu demi satu. Itu dia.
Matrix
3
Kebohongan! ;) Anda dapat menambal file font untuk mengubah tinggi baris - lihat jawaban saya di halaman ini.
Philippe
Saya dituntun untuk percaya bahwa ada cara untuk melakukan ini dengan NSAttributedString. Jika Anda memerlukan label dengan string yang diatribusikan di pra iOS 6, lihat OHAttributedLabel .
Spencer Williams
Lakukan dengan NSAttributesString jika Anda menggunakan iOS> = 6. Contoh
d.ennis
Ini Sederhana dan Bekerja dengan Baik.
R. Mohan
75

Mulai di ios 6 Anda dapat mengatur string yang diatribusikan di 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 ;
iosMentalist
sumber
1
Terima kasih! Saya akan menambahkan bahwa menggunakan AttributedStringmenonaktifkan misalnya perataan teks label, jadi Anda harus menambahkannya ke gaya paragraf.
cyborg86pl
56

Anda dapat mengontrol spasi baris di storyboard:

pertanyaan duplikat

Mike S.
sumber
10
Namun di Xcode 6.1.1 memilih label dan mengubah nilai baris pada panel yang dikaitkan akan menyebabkan panel berkedip dan mengunci aplikasi. Saya hanya bisa keluar dari panel dengan memaksa-berhenti Xcode.
Izk
4
Jempol untuk animasi
Tieme
1
Dalam versi 7.1 panel berkedip dan tidak berpengaruh pada waktu berjalan. Harus melakukannya dalam kode.
MiguelSlv
Listrik 440 watt mengalir melalui panel saya sekarang;)
Sarasranglt
23

Dari Pembuat Antarmuka:

masukkan deskripsi gambar di sini

Secara terprogram:

Cepat 4

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

        // 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 = "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


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
Perlu melewati hanya satu baris argumenSpacing atau multipleLineheight, tidak dapat melewati kedua argumen, jika tidak, tidak ada hasil yang akan datang, saya pikir
Arpit B Parekh
16

Solusi saya adalah menambal file font itu sendiri dan memperbaiki tinggi barisnya dengan pasti. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

Saya harus memodifikasi 'lineGap', 'ascender', 'descender' di blok 'hhea' (seperti dalam contoh blog).

Philippe
sumber
Sangat keren! Alat font OS X itu juga berfungsi untuk font OTF saya (meskipun itu hanya menentukan TTF ...). Font saya memiliki line-height 1000 (!), Saya mengubahnya menjadi 0 dan voila. Saya memiliki bermil-mil ruang kosong di bawah teks di setiap baris.
Jonny
2
Saya tidak percaya ini adalah solusi terbaik (jangan tersinggung!), Tetapi sejauh ini yang paling sederhana. Saya menggunakan perangkat lunak gratis (Windows) Type Light (dan di bawah Font | Metrics | Advanced Anda dapat memodifikasi lineGap) untuk mengedit font saya. Ini juga memungkinkan Anda untuk "mengganti nama" font, yang saya tidak tahu bagaimana melakukannya dengan menggunakan alat yang disebutkan Philippe.
Kirk Woll
Ini @Philippe yang luar biasa! Terima kasih atas kirimannya !!
Robbie
Juga lihat jawaban saya untuk pertanyaan serupa untuk lebih spesifik: stackoverflow.com/a/19553827/201828
phatmann
@iamjustaprogrammer Ini online lagi.
Matt B.
8

Orang ini membuat kelas untuk mendapatkan tinggi baris (tanpa menggunakan CoreText, sebagai pustaka MTLabel): https://github.com/LemonCake/MSLabel

adriendenat
sumber
4

Saya menemukan Perpustakaan Pihak Ketiga Seperti ini:

https://github.com/Tuszy/MTLabel

Menjadi solusi termudah.

Derek Bredensteiner
sumber
MSLabel lebih baik
triliunan
2

Berikut beberapa kode cepat bagi Anda untuk mengatur spasi baris secara terprogram

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
ullstrm
sumber
0

Tentu saja, jawaban Mike tidak berfungsi jika Anda meneruskan string secara terprogram. Dalam hal ini Anda perlu meneruskan string yang diatribusikan dan mengubah gayanya.

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;
Ricardo Mutti
sumber