Nhiều dòng văn bản trong UILabel


443

Có cách nào để có nhiều dòng văn bản UILabelgiống như trong UITextViewhoặc tôi nên sử dụng dòng thứ hai thay thế?


5
Lưu ý rằng UILineBreakModeWordWrapkhông được dùng trong iOS 6. Bây giờ bạn nên sử dụng NSLineBreakByWordWrapping = 0Xem tài liệu tại đây
Austin

kiểm tra câu hỏi này stackoverflow.com/questions/2312899/
Mạnh

Câu trả lời:


796

Tôi tìm thấy một giải pháp.

Người ta chỉ cần thêm mã sau đây:

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

Đã khôi phục câu trả lời cũ (để tham khảo và các nhà phát triển sẵn sàng hỗ trợ iOS dưới 6.0):

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

Về phía: cả hai giá trị enum mang lại 0dù sao.


16
UILineBreakModeWordWrap thực sự là mặc định nên bạn không cần dòng đầu tiên.
Jarred Olson

1
Đối với những người sử dụng swift: cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingcell.textLabel?.numberOfLines = 0
boidkan

5
Cảm ơn vì cũng đã cung cấp Xamarin-Code. Tự động hoàn thành không hoạt động vì họ đã chọn viết tắt tài sản đó ... +1
Jan Gillich

Tôi đồng ý với Jarred Olson, NSLineBreakByWordWrappingmặc định . Tôi thêm tài sản sizeToFit như hướng dẫn của Gurumoorthy Arumugam để sửa chữa nó. Nếu bạn muốn phông chữ bên trong nhãn của bạn tự điều chỉnh để phù hợp với ranh giới của nhãn. Bạn có thể sử dụng: textLabel.adjustFontSizeToFitWidth = YES; Cảm ơn tất cả.
ryan tran

@JarredOlson Docs nói "Thuộc tính này được đặt thành byTruncatingTail theo mặc định."
Hóa đơn

138

Trong IB, đặt số lượng dòng thành 0 (cho phép các dòng không giới hạn)

Khi nhập vào trường văn bản bằng IB, sử dụng "alt-return" để chèn trả về và đi đến dòng tiếp theo (hoặc bạn có thể sao chép trong văn bản đã được phân tách bằng các dòng).


1
[Khi anh cố ý khai quật lên một sợi hơn hơn một tuổi ...] Một điều đôi khi tôi ước gì có thể làm trong IB là nhập văn bản mà không cần ngắt dòng nhúng, thiết UILineBreakModeWordWrap và numberOfLines = 0, và sau đó có ô tô nhãn - Kích thước chiều cao tự động, tất cả trong khi vẫn thiết kế trong IB. Tôi đang nghĩ về trường hợp khung nhìn được thay đổi kích thước thành ngang, trong đó ngắt dòng trong nhãn có thể có vấn đề. Hoặc ... tôi có thể đang lạm dụng IB! Có lẽ việc các nhãn tự động kích thước trong IB gây ra nhiều vấn đề hơn nó giải quyết? (Ngoài ra, dù sao thì bạn cũng không thể gọi sizeToFit vào thời điểm này.)
Joe D'Andrea

Điều "0" tôi nhận được từ các tài liệu cho UILabel, sự trở lại từ một người bạn đã sử dụng Trình tạo giao diện trong nhiều năm.
Kendall Helmstetter Gelner

3
+1 vì là câu trả lời duy nhất để đề cập đến "alt-return". Cụ thể là "ctrl-return" có vẻ như nó sẽ hoạt động nhưng không.
paulmelnikow

52

Giải pháp tốt nhất mà tôi đã tìm thấy (đối với một vấn đề khó chịu khác cần được giải quyết trong khung) tương tự như vaychick.

Chỉ cần đặt số dòng thành 0 trong IB hoặc mã

myLabel.numberOfLines = 0;

Điều này sẽ hiển thị các dòng cần thiết nhưng sẽ định vị lại nhãn sao cho chính giữa của nó theo chiều ngang (sao cho nhãn 1 dòng và 3 dòng được căn chỉnh theo vị trí nằm ngang của chúng). Để sửa lỗi đó thêm:

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;

Giải quyết Truy vấn của tôi với sự giúp đỡ của bạn và @Ilya Suzdalnitski. Cảm ơn rất nhiều.
Mihir Oza

33

Sử dụng để có nhiều dòng văn bản trong UILabel:

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

Nhanh:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

Nếu bạn phải sử dụng:

myLabel.numberOfLines = 0;

thuộc tính bạn cũng có thể sử dụng ngắt dòng tiêu chuẩn ("\n"), trong mã, để buộc một dòng mới.


15

Bạn có thể sử dụng \rđể đi đến dòng tiếp theo trong khi điền vào UILabelsử dụng NSString.

UILabel * label;


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

14

chúng ta hãy cố gắng này

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

ngoài ra, điều này có thể được đặt trong toàn bộ thuộc tính IB 'Lines' thành 0 trên UILabel.
KoreanXcodeWorker

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

Các giải pháp trên không hoạt động trong trường hợp của tôi. Tôi đang làm như thế này:

- (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
Đặt số dòng không cho thông tin văn bản động, nó sẽ hữu ích cho việc thay đổi văn bản.

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

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


1
Cảm ơn bạn Krunal nó làm việc cho tôi!
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;

Vì một số lý do, nó không hoạt động với tôi trong iOS 6, không biết tại sao. Đã thử nó với và không có văn bản quy kết. Bất kỳ đề xuất.


6

Hãy thử sử dụng cái này:

lblName.numberOfLines = 0;
[lblName sizeToFit];

sizeToFit không hoạt động khi numberOfLine khác 0. Nó thật thú vị.
Cá ngừ Onur

3

Những điều này đã giúp tôi

Thay đổi các thuộc tính này của UILabel

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

Và trong khi đưa ra chuỗi đầu vào, hãy sử dụng \ n để hiển thị các từ khác nhau trong các dòng khác nhau.

Thí dụ :

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

3

Cách 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
    }
}

Bây giờ gọi đơn giản như thế này

myLbl.lblFunction()//Replace your label name 

VÍ DỤ:

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

Cách 2:

Lập trình

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

Cách 3:

Thông qua bảng câu chuyện

Để hiển thị nhiều dòng được đặt 0 (Không), điều này sẽ hiển thị nhiều hơn một dòng trong nhãn của bạn.

Nếu bạn muốn hiển thị n dòng, đặt n.

Xem màn hình dưới đây.

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

Nếu bạn muốn đặt kích thước phông chữ tối thiểu cho nhãn Nhấp vào Tự động thu nhỏ và Chọn tùy chọn Kích thước phông chữ tối thiểu

Xem màn hình dưới đây

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

Ở đây đặt kích thước phông chữ tối thiểu

EX: 9 (Trong ảnh này)

Nếu nhãn của bạn nhận được nhiều văn bản hơn tại thời điểm đó, văn bản nhãn của bạn sẽ bị thu hẹp tối đa 9

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


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

đừng quên thêm: [nhãnName setLineBreakMode: NSLineBreakByWordWrapping];
Irineu Licks Filho

2

Bạn cũng có thể làm điều đó thông qua Storyboard:

  1. Chọn Nhãn trên bộ điều khiển xem
  2. Trong Trình theo dõi thuộc tính, tăng giá trị của tùy chọn Dòng (Nhấn Alt + Cmd + 4 để hiển thị Trình theo dõi thuộc tính)
  3. Nhấp đúp vào Nhãn trong trình điều khiển xem và viết hoặc dán văn bản của bạn
  4. Thay đổi kích thước Nhãn và / hoặc tăng kích thước phông chữ để có thể hiển thị toàn bộ văn bản

và đặt Dòng thành 0, nếu không, nó sẽ chỉ hiển thị văn bản có thể được đặt vào số lượng dòng được chỉ định, các dòng khác sẽ bị bỏ qua.
toing_to

2

bạn nên thử điều này:

-(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
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";

1

Đã trả lời, nhưng bạn cũng có thể làm điều đó bằng tay trong bảng phân cảnh. Trong Trình kiểm tra thuộc tính cho nhãn, bạn có thể thay đổi ngắt dòng thành gói quấn (hoặc gói ký tự).


1

Trong hàm này, truyền chuỗi mà bạn muốn gán trong nhãn và chuyển kích thước phông chữ thay cho self.activityFont và chuyển chiều rộng nhãn thay cho 235, bây giờ bạn có chiều cao nhãn theo chuỗi của mình. nó sẽ hoạt động tốt

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

}

1

Đặt bên dưới hoặc trong mã hoặc trong bảng phân cảnh

Nhãn.lineBreakMode = NSLineBreakByWordWrapping; Nhãn.numberOfLines = 0;

và xin đừng quên đặt các ràng buộc trái, phải, trên và dưới cho nhãn nếu không nó sẽ không hoạt động.


Ở mọi nơi nó nói để đặt bọc từ và dòng no.of thành 0. Nhưng tôi vẫn không bao bọc. Đặt ràng buộc trái, trên, dưới và phải làm cho nó được bọc.
anoo_radha

1

Swift 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

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

0

Trên C #, điều này làm việc cho tôi trong 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);

Tôi nghĩ vấn đề ở đây là: -

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

-2

Mã này đang trả về kích thước chiều cao theo văn bản

+ (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;
}
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.