ข้อความหลายบรรทัดใน UILabel


443

มีวิธีที่จะมีข้อความหลายบรรทัดUILabelเหมือนกันในUITextViewหรือฉันควรใช้ที่สองแทน?


5
โปรดทราบว่าUILineBreakModeWordWrapเลิกใช้แล้วใน iOS 6 ตอนนี้คุณควรใช้NSLineBreakByWordWrapping = 0ดูเอกสารที่นี่
Austin

ตรวจสอบคำถามนี้ stackoverflow.com/questions/2312899/…
1766342

คำตอบ:


796

ฉันพบวิธีแก้ปัญหา

มีเพียงแค่เพิ่มรหัสต่อไปนี้:

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

คืนคำตอบเก่า (สำหรับการอ้างอิงและผู้ที่เต็มใจสนับสนุน iOS ต่ำกว่า 6.0):

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

ที่ด้านข้าง: ค่า enum ทั้งคู่ให้ผล0อยู่ดี


16
UILineBreakModeWordWrap จริง ๆ แล้วเป็นค่าเริ่มต้นดังนั้นคุณไม่ต้องการบรรทัดแรก
Jarred Olson

1
สำหรับผู้ที่ใช้อย่างรวดเร็ว: cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingและcell.textLabel?.numberOfLines = 0
boidkan

5
ขอบคุณที่ให้รหัส Xamarin ด้วย การเติมข้อความอัตโนมัติไม่ทำงานเพราะพวกเขาเลือกที่จะย่อคุณสมบัตินี้ ... +1
Jan Gillich

ผมเห็นด้วยกับจาร์เรดโอลสันNSLineBreakByWordWrappingเป็นค่าเริ่มต้น ฉันได้เพิ่มคุณสมบัติsizeToFitเช่นคำแนะนำของ Gurumoorthy Arumugam เพื่อแก้ไข หากคุณต้องการแบบอักษรภายในฉลากของคุณเพื่อปรับตัวเองให้พอดีกับขอบเขตของฉลาก คุณสามารถใช้: textLabel.adjustsFontSizeToFitWidth = YES; ขอบคุณทุกคน
ryan tran

@JarredOlson เอกสารพูดว่า "คุณสมบัตินี้ตั้งเป็น byTruncatingTail โดยค่าเริ่มต้น"
Bill

138

ใน IB กำหนดจำนวนบรรทัดเป็น 0 (อนุญาตให้ใช้ไม่ จำกัด บรรทัด)

เมื่อพิมพ์ภายในฟิลด์ข้อความโดยใช้ IB ให้ใช้ "alt-return" เพื่อแทรกการส่งคืนและไปที่บรรทัดถัดไป (หรือคุณสามารถคัดลอกข้อความที่คั่นด้วยบรรทัดแล้ว)


1
[ในขณะที่เขาขุดเธรดที่มีอายุมากกว่าหนึ่งปีอย่างรู้เท่าทัน…] สิ่งหนึ่งที่ฉันอยากทำใน IB คือป้อนข้อความโดยไม่ต้องมีการแบ่งบรรทัดฝังตั้ง UILineBreakModeWordWrap และ numberOfLines = 0 แล้วมีป้ายกำกับอัตโนมัติ - ปรับขนาดความสูงโดยอัตโนมัติในขณะที่ยังคงออกแบบใน IB ฉันกำลังคิดถึงกรณีที่มุมมองถูกปรับขนาดให้เป็นแนวนอนซึ่งเส้นแบ่งในฉลากอาจเป็นปัญหาได้ หรือ ... ฉันอาจจะใช้ IB ในทางที่ผิด! บางทีการมีป้ายกำกับขนาดอัตโนมัติภายใน IB อาจทำให้เกิดปัญหามากกว่าที่จะแก้ได้ใช่ไหม (นอกจากนี้คุณไม่สามารถเรียกใช้ sizeToFit ที่จุดนี้ต่อไป.)
โจ D'Andrea

สิ่งที่ "0" ที่ฉันได้รับจากเอกสารสำหรับ UILabel ผลตอบแทนจากเพื่อนที่ใช้ Interface Builder มาหลายปีแล้ว
Kendall Helmstetter Gelner

3
+1 สำหรับการเป็นคำตอบเดียวที่พูดถึง "alt-return" โดยเฉพาะอย่างยิ่ง "ctrl-return" ดูเหมือนว่าจะใช้งานได้ แต่ไม่ทำงาน
paulmelnikow

52

ทางออกที่ดีที่สุดที่ฉันได้พบ (สำหรับปัญหาที่น่าผิดหวังอย่างอื่นที่ควรได้รับการแก้ไขในกรอบ) คล้ายกับของ vaychick

เพียงกำหนดจำนวนบรรทัดเป็น 0 ใน IB หรือรหัส

myLabel.numberOfLines = 0;

สิ่งนี้จะแสดงเส้นที่ต้องการ แต่จะเปลี่ยนตำแหน่งฉลากเพื่อให้อยู่กึ่งกลางในแนวนอน (เพื่อให้ป้าย 1 บรรทัดและ 3 บรรทัดถูกจัดตำแหน่งในแนวนอน) ในการแก้ไขปัญหาที่เพิ่ม:

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;

แก้แบบสอบถามของฉันด้วยความช่วยเหลือของคุณและ @Ilya Suzdalnitski ขอบคุณมาก.
Mihir Oza

33

ใช้สิ่งนี้เพื่อมีข้อความหลายบรรทัดในUILabel:

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

สวิฟท์:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

หากคุณต้องใช้:

myLabel.numberOfLines = 0;

คุณสมบัติคุณยังสามารถใช้ตัวแบ่งบรรทัดมาตรฐาน("\n")ในรหัสเพื่อบังคับให้ขึ้นบรรทัดใหม่


15

คุณสามารถใช้\rเพื่อไปยังบรรทัดถัดไปในขณะที่เติมขึ้นโดยใช้UILabelNSString

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];

14

ลองทำสิ่งนี้

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          

นอกจากนี้ยังสามารถตั้งค่าตลอดแอตทริบิวต์ IB 'Lines' เป็น 0 ใน UILabel
KoreanXcodeWorker

11
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

การแก้ปัญหาข้างต้นไม่ได้ผลในกรณีของฉัน ฉันทำแบบนี้:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}


8

Swift 3
ตั้งค่าจำนวนบรรทัดศูนย์สำหรับข้อมูลข้อความแบบไดนามิกมันจะมีประโยชน์สำหรับข้อความที่แตกต่างกัน

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame

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


1
ขอบคุณ Krunal ที่ได้ผลกับฉัน!
Yogesh Patel

6
UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

ด้วยเหตุผลบางอย่างมันไม่ทำงานสำหรับฉันใน iOS 6 ไม่แน่ใจว่าทำไม พยายามด้วยและไม่มีข้อความประกอบ ข้อเสนอแนะใด ๆ



3

สิ่งเหล่านี้ช่วยฉัน

เปลี่ยนคุณสมบัติเหล่านี้ของ UILabel

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

และในขณะที่ให้อินพุตสตริงใช้ \ n เพื่อแสดงคำต่าง ๆ ในบรรทัดที่ต่างกัน

ตัวอย่าง:

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;

3

วิธีที่ 1:

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

ตอนนี้เรียกแบบนี้

myLbl.lblFunction()//Replace your label name 

EX:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

วิธีที่ 2:

โปรแกรม

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

วิธีที่ 3:

ผ่านกระดานเรื่องราว

หากต้องการแสดงหลายบรรทัดตั้งค่า 0 (ศูนย์) สิ่งนี้จะแสดงมากกว่าหนึ่งบรรทัดในฉลากของคุณ

หากคุณต้องการแสดง n บรรทัดให้ตั้งค่า n

ดูหน้าจอด้านล่าง

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

หากคุณต้องการตั้งค่าขนาดตัวอักษรขั้นต่ำสำหรับป้ายกำกับคลิกตัวเลือก Autoshrink และเลือกขนาดตัวอักษรขั้นต่ำ

ดูหน้าจอด้านล่าง

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

ที่นี่กำหนดขนาดตัวอักษรขั้นต่ำ

ตัวอย่าง: 9 (ในภาพนี้)

หากป้ายข้อความของคุณได้รับข้อความเพิ่มเติมในเวลานั้นข้อความป้ายกำกับของคุณจะลดลงสูงสุด 9

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


2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

อย่าลืมเพิ่ม: [labelName setLineBreakMode: NSLineBreakByWordWrapping];
Irineu Licks Filho

2

คุณสามารถทำได้ผ่านกระดานเรื่องราวด้วย:

  1. เลือกเลเบลบนตัวควบคุมมุมมอง
  2. ในตัวตรวจสอบแอตทริบิวต์เพิ่มค่าของตัวเลือกบรรทัด (กด Alt + Cmd + 4 เพื่อแสดงตัวตรวจสอบแอตทริบิวต์)
  3. คลิกสองครั้งที่ป้ายชื่อในตัวควบคุมมุมมองและเขียนหรือวางข้อความของคุณ
  4. ปรับขนาดฉลากและ / หรือเพิ่มขนาดตัวอักษรเพื่อให้สามารถแสดงข้อความทั้งหมดได้

และตั้งค่า Lines เป็น 0 มิฉะนั้นจะแสดงเฉพาะข้อความที่สามารถใส่ลงไปในจำนวนบรรทัดที่ระบุผู้อื่นจะถูกละเว้น
toing_toing

2

คุณควรลองสิ่งนี้:

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}


1

ตอบแล้ว แต่คุณสามารถทำได้ด้วยตนเองในกระดานเรื่องราวด้วย ภายใต้ตัวตรวจสอบคุณสมบัติสำหรับป้ายกำกับคุณสามารถเปลี่ยนการแบ่งบรรทัดเป็นการตัดคำ (หรือการตัดอักขระ)


1

ในฟังก์ชั่นนี้ pass string ที่คุณต้องการกำหนดใน label และขนาดตัวอักษร pass แทนที่ self.activityFont และ pass width width แทน 235 ตอนนี้คุณจะได้รับความสูงของเลเบลตามสตริงของคุณ มันจะทำงานได้ดี

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}

1

ตั้งค่าด้านล่างทั้งในรหัสหรือในกระดานเรื่องราวเอง

Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;

และโปรดอย่าลืมตั้งข้อ จำกัด ด้านซ้ายขวาด้านบนและด้านล่างไม่เช่นนั้นจะใช้งานไม่ได้


ทุกที่มันบอกว่าจะตั้งค่าการตัดคำและหมายเลขของบรรทัดเป็น 0 แต่ก็ยังฉันไม่ได้ห่อ การตั้งค่าข้อ จำกัด ด้านซ้ายด้านบนด้านล่างและด้านขวาทำให้ห่อ
anoo_radha

1

สวิฟท์ 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

0

ใน C # สิ่งนี้ใช้ได้กับฉันใน UITableViewCell

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

ฉันคิดว่าจุดนี่คือ: -

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;

-2

รหัสนี้จะคืนความสูงขนาดตามข้อความ

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.