วิธีเพิ่มตัวแบ่งบรรทัดสำหรับ UILabel


262

มาดูกันว่าฉันมีสตริงหน้าตาแบบนี้:

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

ฉันจะทำอย่างไรเพื่อให้ UILabel แสดงข้อความเช่นนี้

AAAAA
BBBBB
CCCCC

ฉันไม่คิดว่า\nเป็นที่รู้จักโดย UILabel ดังนั้นมีอะไรที่ฉันสามารถใส่ใน NSString เพื่อให้ UILabel รู้ว่ามันต้องสร้างตัวแบ่งบรรทัดที่นั่นหรือไม่

คำตอบ:


332

ใช้\nตามที่คุณใช้ในสตริงของคุณ

ตั้งค่า numberOfLines เป็น 0 เพื่ออนุญาตจำนวนบรรทัดใด ๆ

label.numberOfLines = 0;

sizeWithFont:อัปเดตกรอบป้ายให้ตรงกับขนาดของข้อความโดยใช้ หากคุณไม่ทำสิ่งนี้ข้อความของคุณจะถูกจัดกึ่งกลางแนวตั้งหรือตัดออก

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

อัปเดต: แทนที่สำหรับที่เลิกใช้แล้ว

sizeWithFont:constrainedToSize:lineBreakMode:

การอ้างอิง, การแทนที่ขนาดที่ไม่รองรับด้วย: ใน 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
UILabelไม่มีคุณสมบัติoriginหรือsizeบน iOS? มันน่าจะเป็นlabel.frame.origin.xฯลฯ
Peterdk

1
แทนที่จะใช้ sizeWithAttributes จากนั้นตั้งค่าเฟรมคุณสามารถเรียก sizeToFit เพื่อออกกำลังกายและกำหนดขนาดเฟรมได้ในขั้นตอนเดียว
jimmyjudas

@ Hermang ขอบคุณสำหรับการแก้ไขคำตอบเพื่อให้ทันสมัย
เจอร์รี่ชอว์

274

ป้อนคำอธิบายรูปภาพที่นี่

ใช้ option-return เมื่อพิมพ์ในกล่องเล็ก ๆ ใน Interface Builder เพื่อแทรก line feed (\ n) ในแอตทริบิวต์ Label ของเครื่องมือสร้างอินเตอร์เฟสให้ตั้งค่า # Lines = 0

เลือกป้ายกำกับจากนั้นเปลี่ยนคุณสมบัติของเส้นเป็น 0 เช่นในภาพด้านบนแล้วใช้ \ n ในสตริงของคุณสำหรับการขึ้นบรรทัดใหม่


2
มันมีประโยชน์มาก!
Nitin Alabur

มองหาสิ่งนี้ตลอดไป ขอบคุณ :)
Shai Mishali

คำตอบที่ยอดเยี่ยม ขอบคุณ!
Macondo2Seattle

1
ไม่ทำงานเมื่อตั้งค่าป้ายกำกับโดยทางโปรแกรมและเพิ่ม \ n (ขึ้นบรรทัดใหม่) ให้กับสตริง
Chewie The Chorkie

น่าอัศจรรย์ ความต้องการของฉันคือการทำสิ่งนี้กับฉลากกระดานเรื่องราวเท่านั้น และสิ่งนี้ทำงานเหมือนมีเสน่ห์
Tejas

132

หากคุณอ่านสตริงจากไฟล์ XML ตัวแบ่งบรรทัด\nในสตริงนี้จะไม่ทำงานในUILabelข้อความ \nไม่ได้แยกวิเคราะห์เป็นตัวแบ่งบรรทัด

นี่เป็นเคล็ดลับเล็กน้อยในการแก้ไขปัญหานี้:

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

myLabel.text = myLabelText;

ดังนั้นคุณต้องเปลี่ยน unparsed \nมีส่วนร่วมในสายของคุณโดยการแยกวิเคราะห์\nใน NSStringhardcoded

นี่คือการตั้งค่าป้ายกำกับอื่น ๆ ของฉัน:

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

สิ่งที่สำคัญที่สุดคือการตั้งค่าnumberOfLinesการ0(= ไม่ จำกัด จำนวนเส้นในฉลาก)

ไม่รู้ว่าทำไม Apple เลือกที่จะไม่แยกวิเคราะห์\nสตริงที่อ่านจาก XML?

หวังว่านี่จะช่วยได้


1
iOS ของคุณไม่ได้แยก\nเมื่อได้รับสายจาก Parse.com (ผมคิดว่ามันก็จะเกิดขึ้นเมื่อได้รับสตริงจาก API ที่อื่น ๆ )
ไบรอัน

คุณบันทึกวันของฉัน ฉันได้รับสายอักขระขึ้นบรรทัดใหม่จากไฟล์ xml
Senry

127

ในตัวสร้างส่วนต่อประสานคุณสามารถใช้Ctrl+ Enterเพื่อแทรก/nไปยังตำแหน่งที่คุณต้องการ วิธีนี้สามารถใช้สถานการณ์ต่อไปนี้

aaa
aaaaaaa


ไม่ฉันไม่ได้ลงคะแนน ฉันเพิ่งแก้ไขคำตอบเพื่อการนำเสนอที่ดีกว่า
Manoj Kumar

ง่ายมากจริงๆ! +1
marlonpya

2
ไม่อยากเชื่อเลยว่าฉันไม่เคยรู้เคล็ดลับนี้เลย! ฉันลองกะใส่เพราะมันค่อนข้างมาตรฐานที่อื่น ขอบคุณสำหรับสิ่งนั้น!
Echelon

นี่คือสิ่งที่ฉันกำลังมองหา! ขอบคุณ +1!
rickrvo

1
โพสต์ยอดเยี่ยม! การแก้ไขเล็กน้อย: ฉันเชื่อว่าคุณหมายถึงการแทรก \ n แทนการแทรก / n
craft

25

คุณจะต้องตั้งค่าสถานที่ให้บริการในnumberOfLines UILabelค่าเริ่มต้นคือ1ถ้าคุณตั้งค่าเป็น0มันจะลบขีด จำกัด ทั้งหมด



10

ใน Swift 2.2,> iOS 8

ฉันได้ตั้งค่า Lines = 0 บนสตอรีบอร์ดภายใต้แอททริบิวของผู้ตรวจสอบและเชื่อมโยงร้านอ้างอิงกับป้ายกำกับ จากนั้นใช้ในคอนโทรลเลอร์เช่นนี้:

 @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

// อย่าลืมตั้ง numberOfLines เป็นศูนย์

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

แค่ทำแบบนี้

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

ใน Xcode 6 คุณสามารถใช้ \ n แม้ในสตริงเมื่อใช้การตัดคำ มันจะทำงาน. ตัวอย่างเช่น:

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

หากคุณใช้งานUILabelคุณต้องจำไว้ว่าการตั้งค่าเริ่มต้นคือ 1 บรรทัดดังนั้นจึงไม่สำคัญว่าคุณจะเพิ่มจำนวน ( \nหรือ\r) จำนวนเท่าใดคุณต้องตรวจสอบให้แน่ใจว่าได้ตั้งค่าเป็นมากกว่าหนึ่งบรรทัดดังนั้นจึงสามารถต่อท้ายได้ เส้นมากขึ้น

อีกทางเลือกหนึ่งคือการใช้งานUITextViewซึ่งมีความหมายจริงๆสำหรับ multilines

คุณสามารถบรรลุสิ่งนี้ได้ในส่วนแอตทริบิวต์ XCode ของ UILabel ดูภาพหน้าจอ:

ป้อนคำอธิบายรูปภาพที่นี่


3

สำหรับผู้ที่ต้องการโซลูชันที่ง่ายให้ทำดังต่อไปนี้ในกล่องป้อนข้อความของป้ายข้อความ:

ตรวจสอบให้แน่ใจว่าตั้งค่าหมายเลขบรรทัดเป็น 0

Alt + Enter

(Alt เป็นปุ่มตัวเลือกของคุณ)

ไชโย!



2

ในกรณีของฉันยัง \ n ไม่ทำงานฉันแก้ไขปัญหาโดยเก็บจำนวนบรรทัดเป็น 0 และคัดลอกและวางข้อความด้วยบรรทัดใหม่เองเช่นแทนที่จะเป็น Hello \ n โลกที่ฉันวาง

สวัสดี

โลก

ในเครื่องมือสร้างอินเตอร์เฟส


ยอดเยี่ยม โรงงาน
DmitryKanunnikoff

2

ใน xCode 11, Swift 5 \nทำงานได้ดีลองโค้ดด้านล่าง:

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

สำหรับคนอื่นที่อาจมีปัญหาsizeWithFont:constrainedToSize:lineBreakMode:หรือใครก็ตามที่เปลี่ยนมาใช้ ios8 (วิธีการเลิกใช้ตั้งแต่ ios7) ฉันปรับความสูงของฉันโดยใช้sizeToFitแทน

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

ดูเหมือนว่าฉันจะเปลี่ยนขนาดเฟรมฉลากโดยเฉพาะเมื่อใช้การเปลี่ยนอัตโนมัติ การใช้เมธอด appendFormat ดูจะเหมาะสมกว่า นี่คือตัวอย่างของฉัน:

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

ถ้าคุณตั้งค่าคุณสมบัติ UILable จากล้วนเป็นคุณสมบัติ ... UILabel จะเก็บข้อความหลายบรรทัดไม่ว่าจะมีกี่ย่อหน้าตามความสูงและความกว้างของ UILabel ของคุณจะถูกตั้งค่าให้พอดีกับพื้นที่หน้าจอที่คุณต้องการแสดงข้อความ


0

ฉันประสบปัญหาเดียวกันและนี่คือวิธีที่ฉันแก้ไขปัญหา หวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน

// 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;  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.