Làm cách nào để thêm ngắt dòng cho UILabel?


262

Hãy xem tôi có một chuỗi trông như thế này:

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

Làm cách nào để tôi tạo nó sao cho UILabel hiển thị thông báo như thế này

AAAAA
BBBBB
CCCCC

Tôi không nghĩ \nlà được UILabel nhận ra, vậy có điều gì tôi có thể đặt vào NSString để UILabel biết rằng nó phải tạo ra một ngắt dòng ở đó không?

Câu trả lời:


332

Sử dụng \nnhư bạn đang sử dụng trong chuỗi của bạn.

Đặt numberOfLines thành 0 để cho phép bất kỳ số lượng dòng nào.

label.numberOfLines = 0;

Cập nhật khung nhãn để phù hợp với kích thước của văn bản bằng cách sử dụng sizeWithFont:. Nếu bạn không làm điều này, văn bản của bạn sẽ được căn giữa theo chiều dọc hoặc bị cắt.

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

Cập nhật: Thay thế cho không dùng nữa

sizeWithFont:constrainedToSize:lineBreakMode:

Tham khảo, Thay thế cho kích thước không dùng nữaWithFont: trong 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
UILabelkhông có tài sản origincũng không có sizetrên iOS? Nó có lẽ nên được label.frame.origin.xvv
Peterdk

1
Thay vì sử dụng sizeWithAttribution sau đó đặt khung, bạn chỉ cần gọi sizeToFit để xử lý và đặt kích thước khung trong một bước nhanh chóng.
jimmyjudas

@Hermang, cảm ơn vì đã chỉnh sửa câu trả lời để cập nhật.
Gerry Shaw

275

nhập mô tả hình ảnh ở đây

Sử dụng tùy chọn trả về khi nhập vào ô nhỏ trong Trình tạo giao diện để chèn nguồn cấp dữ liệu (\ n). Trong thuộc tính Nhãn của Trình tạo giao diện, đặt # Lines = 0.

Chọn nhãn và sau đó thay đổi thuộc tính Lines thành 0 như trong hình trên, sau đó sử dụng \ n trong chuỗi của bạn để ngắt dòng.


2
Điều này là siêu hữu ích!
Nitin Alabur

Đã tìm kiếm điều này mãi mãi. Cảm ơn :)
Shai Mishali

Câu trả lời tuyệt vời. Cảm ơn!
Macondo2Seatussy

1
Không hoạt động khi cài đặt nhãn theo chương trình và thêm \ n (dòng mới) vào chuỗi.
Chewie The Chorkie

kinh ngạc. Yêu cầu của tôi là chỉ làm điều này với nhãn bảng phân cảnh. Và điều này làm việc như một lá bùa.
Tejas

132

Nếu bạn đọc một chuỗi từ tệp XML, ngắt dòng \ntrong chuỗi này sẽ không hoạt động trong UILabelvăn bản. Không \nđược phân tích cú pháp để ngắt dòng.

Đây là một mẹo nhỏ để giải quyết vấn đề này:

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

myLabel.text = myLabelText;

Vì vậy, bạn phải thay thế phần chưa được chỉnh sửa \ntrong chuỗi của mình bằng một phân tích cú pháp \ntrong mã hóa cứng NSString.

Dưới đây là các cài đặt nhãn khác của tôi:

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

Quan trọng nhất là đặt numberOfLinesthành 0(= không giới hạn số dòng trong nhãn).

Không biết tại sao Apple lại chọn không phân tích cú pháp \nđọc từ XML?

Hi vọng điêu nay co ich.


1
iOS không phân tích cú pháp \nkhi nhận chuỗi từ Parse.com (Tôi đoán điều đó cũng sẽ xảy ra khi nhận chuỗi từ các API khác)
Brian

Bạn đã cứu ngày của tôi. Tôi đang nhận được chuỗi với dòng mới từ các tệp xml.
Senry

127

Trong trình tạo giao diện, bạn có thể sử dụng Ctrl+ Enterđể chèn /nvào vị trí bạn muốn. Cách này có thể thực hiện các tình huống sau đây

aaa
aaaaaaa


Không, tôi đã không bỏ phiếu. Tôi chỉ chỉnh sửa câu trả lời để trình bày tốt hơn.
Manoj Kumar

Thật đơn giản! +1
marlonpya

2
Không thể tin rằng tôi không bao giờ biết mẹo đó! Tôi đã thử shift-Enter vì điều đó khá chuẩn ở nơi khác. Cảm ơn vì điều đó!
Echelon

đây chính xác là những gì tôi đang tìm kiếm! cảm ơn bạn +1!
rickrvo

1
Bài đăng tuyệt vời! Chỉnh sửa nhỏ: Tôi tin rằng bạn có nghĩa là chèn \ n thay vì chèn / n
craft

25

Bạn phải đặt numberOfLinestài sản trên UILabel. Mặc định là 1 , nếu bạn đặt thành 0, nó sẽ xóa tất cả các giới hạn.


22

Điều quan trọng cần lưu ý là \n(dấu gạch chéo ngược) chứ không phải /n.


10

Trong Swift 2.2,> iOS 8

Tôi đã đặt Lines = 0 trên Storyboard, bên dưới Trình theo dõi thuộc tính và liên kết một cửa hàng tham chiếu với nhãn. Sau đó sử dụng trong bộ điều khiển như thế này:

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

6

// Đừng quên đặt numberOfLines thành 0

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

6

Cứ làm đi

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;

4

Trên Xcode 6, bạn chỉ có thể sử dụng \ n ngay cả trong chuỗi khi sử dụng gói từ. Nó sẽ làm việc. Ví dụ:

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

Nếu bạn sử dụng, UILabelbạn phải nhớ rằng cài đặt mặc định là 1 dòng, do đó, bạn thêm ( \nhoặc \r) bao nhiêu lần nghỉ , bạn cần đảm bảo rằng nó được đặt thành nhiều hơn một dòng để có thể được phép nối thêm nhiều dòng hơn.

Một cách khác là sử dụng UITextViewnó thực sự có ý nghĩa cho đa dòng.

Bạn có thể dễ dàng đạt được điều này trong phần thuộc tính XCode của UILabel, xem ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây


3

Đối với những người bạn muốn một giải pháp dễ dàng, hãy làm như sau trong hộp nhập văn bản Nhãn:

Đảm bảo rằng các dòng số của bạn được đặt thành 0.

Alt + Enter

(Alt là khóa tùy chọn của bạn)

Chúc mừng!



2

Trong trường hợp của tôi cũng không hoạt động, tôi đã khắc phục sự cố bằng cách giữ số dòng thành 0 và sao chép và dán văn bản với chính dòng mới, ví dụ thay vì Hello \ n World i đã dán

xin chào

Thế giới

trong trình xây dựng giao diện.


Thông minh! Làm.
DmitryKanunnikoff

2

Trong xCode 11, Swift 5 \nhoạt động tốt, hãy thử đoạn mã dưới đây:

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

Đối với bất kỳ ai khác có thể gặp rắc rối với sizeWithFont:constrainedToSize:lineBreakMode:hoặc bất kỳ ai chuyển sang ios8 (phương pháp không được chấp nhận kể từ ios7), tôi đã điều chỉnh chiều cao của mình bằng cách sử dụng sizeToFitthay thế.

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

Tôi có vẻ sai khi thay đổi kích thước khung nhãn đặc biệt là khi sử dụng tự động thanh toán. Sử dụng phương pháp appendFormat có vẻ phù hợp hơn. Đây là ví dụ của tôi:

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

Nếu bạn đặt các thuộc tính UILable của mình từ Plain thành Attribution ... thì UILabel sẽ giữ văn bản đa dòng cho dù có bao nhiêu đoạn cho chiều cao và chiều rộng của UILabel của bạn được đặt để vừa với vùng màn hình bạn muốn hiển thị văn bản.


0

Tôi đã phải đối mặt với cùng một vấn đề, và đây là cách tôi giải quyết vấn đề. Hy vọng điều này sẽ hữu ích cho một ai đó.

// Swift 2

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

// Mục tiêu-C

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

// C # (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.