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?

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

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.


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.


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


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.



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

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;

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];

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;

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


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!



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.


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"

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

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

0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];

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;

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.


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;  
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.