Bagaimana cara menambahkan jeda baris untuk UILabel?

262

Coba lihat bahwa saya memiliki string seperti ini:

NSString *longStr = @"AAAAA\nBBBBB\nCCCCC";  

Bagaimana saya membuatnya sehingga UILabel menampilkan pesan seperti ini

AAAAA
BBBBB
CCCCC

Saya pikir tidak \ndikenali oleh UILabel, jadi adakah yang bisa saya masukkan ke dalam NSString sehingga UILabel tahu bahwa itu harus membuat line break di sana?

Thang Pham
sumber

Jawaban:

332

Gunakan \nseperti yang Anda gunakan dalam string Anda.

Atur numberOfLines ke 0 untuk memungkinkan sejumlah baris.

label.numberOfLines = 0;

Perbarui bingkai label agar sesuai dengan ukuran teks yang digunakan sizeWithFont:. Jika Anda tidak melakukan ini, teks Anda akan terpusat vertikal atau terpotong.

UILabel *label; // set frame to largest size you want
...
CGSize labelSize = [label.text sizeWithFont:label.font
                          constrainedToSize:label.frame.size
                              lineBreakMode:label.lineBreakMode];
label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

Pembaruan: Penggantian untuk usang

sizeWithFont:constrainedToSize:lineBreakMode:

Referensi, Penggantian untuk ukuran yang sudah usangWithFont: di iOS 7?

CGSize labelSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];

label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);
Gerry Shaw
sumber
2
UILabeltidak memiliki originatau sizeproperti pada iOS? Mungkin seharusnya label.frame.origin.xdll.
Peterdk
1
Alih-alih menggunakan sizeWithAttributes kemudian mengatur frame, Anda bisa memanggil sizeToFit untuk berolahraga dan mengatur ukuran frame dalam satu langkah cepat.
jimmyjudas
@Hermang, terima kasih telah mengedit jawaban untuk memutakhirkannya.
Gerry Shaw
275

masukkan deskripsi gambar di sini

Gunakan opsi-kembali saat mengetik di kotak kecil di Interface Builder untuk memasukkan umpan baris (\ n). Dalam atribut Label Pembangun Antarmuka, set # Lines = 0.

Pilih label dan kemudian ubah properti Lines ke 0 seperti pada gambar di atas, dan kemudian gunakan \ n dalam string Anda untuk jeda baris.

Marco
sumber
2
ini sangat berguna!
Nitin Alabur
Mencari ini selamanya. Terima kasih :)
Shai Mishali
Jawaban yang fantastis. Terima kasih!
TotoroTotoro
1
Tidak berfungsi saat mengatur label secara terprogram dan menambahkan \ n (baris baru) ke string.
Chewie The Chorkie
luar biasa. Persyaratan saya adalah melakukan ini hanya dengan label storyboard. Dan ini bekerja seperti pesona.
Tejas
132

Jika Anda membaca string dari file XML, baris break \ndi string ini tidak akan berfungsi dalam UILabelteks. Tidak \ndiuraikan untuk istirahat baris.

Berikut adalah sedikit trik untuk mengatasi masalah ini:

// correct next line \n in string from XML file
NSString *myNewLineStr = @"\n";
myLabelText = [myLabelText stringByReplacingOccurrencesOfString:@"\\n" withString:myNewLineStr];

myLabel.text = myLabelText;

Jadi, Anda harus mengganti bagian yang tidak diuraikan \ndalam string Anda dengan yang diuraikan \ndalam hardcode NSString.

Berikut adalah pengaturan label saya yang lain:

myLabel.numberOfLines = 0;
myLabel.backgroundColor = [UIColor lightGrayColor];
myLabel.textColor = [UIColor redColor]; 
myLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];   
myLabel.textAlignment = UITextAlignmentCenter;

Yang paling penting adalah mengatur numberOfLineske 0(= jumlah garis dalam label yang tidak terbatas).

Tidak tahu mengapa Apple memilih untuk tidak menguraikan \nstring yang dibaca dari XML?

Semoga ini membantu.

Al-Noor Ladhani
sumber
1
iOS tidak mem-parsing \nketika mendapatkan string dari Parse.com (saya kira itu juga akan terjadi ketika mendapatkan string dari API lain)
Brian
Kamu menyelamatkan hariku. Saya mendapatkan string dengan baris baru dari file xml.
Senry
127

Di pembuat antarmuka, Anda dapat menggunakan Ctrl+ Enteruntuk menyisipkan /nke posisi yang Anda inginkan. Cara ini bisa menerapkan situasi berikut

aaa
aaaaaaa

kuokuo321
sumber
Tidak, saya tidak memilih. Saya baru saja mengedit jawaban untuk presentasi yang lebih baik.
m4n0
Sangat sederhana! +1
marlonpya
2
Tidak percaya saya tidak pernah tahu trik itu! Saya sudah mencoba shift-Enter karena itu cukup standar di tempat lain. Terima kasih untuk itu!
Eselon
ini persis apa yang saya cari! +1 terima kasih!
rickrvo
1
Pos yang bagus! Koreksi kecil: Saya yakin maksud Anda memasukkan \ n alih-alih menyisipkan / n
kerajinan
25

Anda harus mengatur numberOfLinesproperti di UILabel. Standarnya adalah 1 , jika Anda menetapkan ke 0 akan menghapus semua batas.

Dan
sumber
22

Penting untuk dicatat \n(backslash) daripada /n.

AndyOng
sumber
10

Di Swift 2.2,> iOS 8

Saya telah menetapkan Lines = 0 di Storyboard, di bawah Attribute Inspector dan menautkan outlet referensi ke label. Kemudian gunakan di controller seperti ini:

 @IBOutlet weak var listLabel: UILabel!

 override func viewDidLoad() {
      ...
      listLabel.text = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8"
 }
CodeOverRide
sumber
7

Lakukan saja seperti ini

NSString * strCheck = @"A\nB";

strCheck = [strCheck stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];  //This is to prevent for fetching string from plist or data structure

label.numberOfLines = 0;

label.lineBreakMode = NSLineBreakByWordWrapping;

label.text = strCheck;
Sandip Patel - SM
sumber
Ini bekerja .. :)
Bibin Joseph
6

// Jangan lupa untuk mengatur numberOfLines ke nol

UILabel* locationTitle = [[UILabel alloc] initWithFrame:CGRectMake(5, 30, 230, 40)];
locationTitle.font = [UIFont systemFontOfSize:13.0];
locationTitle.numberOfLines = 0;
locationTitle.text = [NSString stringWithFormat:@"Eaton industries pvt. Ltd \nUK Apr 12"];
[cell addSubview:locationTitle];
Pankaj Chauhan
sumber
4

Pada Xcode 6, Anda bisa menggunakan \ n bahkan di dalam string saat menggunakan bungkus kata. Itu akan berhasil. Jadi misalnya:

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, screenRect.size.width, 50)];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"This will be on the first line\nfollowed by a line under it.";
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
Roi
sumber
3

Jika Anda menggunakan UILabelAnda harus ingat bahwa pengaturan default adalah 1 baris, jadi tidak masalah berapa banyak jeda yang Anda tambahkan ( \natau \r), Anda perlu memastikan itu disetel ke lebih dari satu baris sehingga dapat diizinkan untuk menambahkan lebih banyak garis.

Salah satu alternatif adalah menggunakan UITextViewyang benar-benar dimaksudkan untuk multilines.

Anda dapat dengan mudah mencapai ini di bagian atribut XCode dari UILabel, lihat tangkapan layar:

masukkan deskripsi gambar di sini

meda
sumber
3

Bagi Anda yang menginginkan solusi mudah, lakukan hal berikut dalam kotak input Label teks:

Pastikan garis angka Anda diatur ke 0.

Alt + Enter

(Alt adalah kunci pilihan Anda)

Bersulang!

Tenggelam
sumber
2

Hanya menggunakan label.numberOfLines = 0;

Menggoreng
sumber
2

Dalam kasus saya juga \ n tidak berfungsi, saya memperbaiki masalah dengan menjaga jumlah baris menjadi 0 dan menyalin dan menempelkan teks dengan baris baru itu sendiri sebagai contoh alih-alih Hello \ n World yang saya tempel

Halo

Dunia

di pembangun antarmuka.

Ranjithkumar
sumber
Luar biasa! Bekerja
DmitryKanunnikoff
2

Di xCode 11, Swift 5 \nberfungsi dengan baik, coba kode di bawah ini:

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"
David_2877
sumber
1
textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);
pengguna3182143
sumber
0

Untuk orang lain yang mungkin memiliki masalah dengan sizeWithFont:constrainedToSize:lineBreakMode:atau siapa pun yang beralih ke ios8 (metode ini sudah usang pada ios7), saya menyesuaikan tinggi badan saya dengan menggunakan sizeToFitsebagai gantinya.

UILabel *label;
label.numberOfLines = 0;
// Setup label with desired settings
...
[label sizeToFit];
label.frame = CGRectMake(label.frame.origin.x,     // Or use any desired origin
                         label.frame.origin.y, 
                         label.frame.size.width,   // Or use any desired width
                         label.frame.size.height);
pengguna3842937
sumber
0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
Grigori A.
sumber
0

Tampaknya salah bagi saya untuk mengubah ukuran bingkai label terutama saat menggunakan autolayout. Menggunakan metode appendFormat tampaknya lebih tepat. Ini contoh saya:

NSMutableString *list = [[NSMutableString alloc] init];
NSArray *textArray = @[@"AAAA", @"BBBB"];
for (NSString *string in textArray) {
    [list appendFormat:@"%@\n", string.mutableCopy];
}
self.label.text = list;
self.label.numberOfLines = 0;
tanya
sumber
0

Jika Anda menyetel properti UILable Anda dari Plain ke Attributed ... UILabel akan menampung teks multiline, tidak peduli berapa banyak paragraf sepanjang panjang dan lebar UILabel Anda diatur agar sesuai dengan area layar tempat Anda ingin menampilkan teks tersebut.

BrainyMonkey
sumber
0

Saya telah menghadapi masalah yang sama, dan inilah cara saya memecahkan masalah. Semoga ini bermanfaat bagi seseorang.

// Swift 2

   lblMultiline.lineBreakMode = .ByWordWrapping // or use NSLineBreakMode.ByWordWrapping
   lblMultiline.numberOfLines = 0 

// Objective-C

  lblMultiline.lineBreakMode = NSLineBreakByWordWrapping;
  lblMultiline.numberOfLines = 0;

// C # (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
Suraj Sonawane
sumber