UILabel - nhãn kích thước tự động để phù hợp với văn bản?


144

Có thể tự động thay đổi kích thước hộp / giới hạn UILabel để phù hợp với văn bản chứa trong đó không? (Tôi không quan tâm nếu nó kết thúc lớn hơn màn hình)

Vì vậy, nếu người dùng nhập "xin chào" hoặc "tên của tôi thực sự dài tôi muốn nó nằm gọn trong hộp này", nó không bao giờ bị cắt cụt và nhãn được 'mở rộng' theo?


Bất cứ ai làm ơn giúp tôi cung cấp mã nhanh chóng ..
Angel F Syrus

Câu trả lời:


98

Vui lòng kiểm tra ý chính của tôi nơi tôi đã tạo một danh mục cho UILabelmột thứ gì đó rất giống nhau, danh mục của tôi cho phép UILabelkéo dài chiều cao để hiển thị tất cả nội dung: https://gist.github.com/1005520

Hoặc xem bài đăng này: https://stackoverflow.com/a/7242981/662605

Điều này sẽ kéo dài chiều cao, nhưng bạn có thể thay đổi nó một cách dễ dàng để làm việc theo cách khác và kéo dài chiều rộng bằng thứ gì đó như thế này, đó là điều tôi tin rằng bạn muốn làm gì:

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

Bạn có thể đơn giản hơn là sử dụng sizeToFitphương thức có sẵn từ UIViewlớp, nhưng đặt số dòng thành 1 là an toàn.


Cập nhật iOS 6

Nếu bạn đang sử dụng AutoLayout, thì bạn đã có một giải pháp tích hợp. Bằng cách đặt số lượng dòng thành 0, khung sẽ thay đổi kích thước nhãn của bạn một cách thích hợp (thêm chiều cao) để phù hợp với văn bản của bạn.


Cập nhật iOS 8

sizeWithFont:không dùng nữa nên sử dụng sizeWithAttributes:thay thế:

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}

8
Sử dụng phương pháp AutoLayout iOS 6 tôi đã bị hạn chế về chiều cao trên nhãn của mình, tôi không thể thoát khỏi. Đặt Mối quan hệ của giới hạn chiều cao thành 'Lớn hơn hoặc bằng' cho phép chiều cao tăng lên.
Michael Luton

2
sizeWithFont: ràng buộc ToSize: lineBreakMode: phương thức được mô tả trong ios 7
Karan Alangat

1
UILabel không tự thay đổi kích thước khi văn bản ít / nhiều hơn. tôi đang sử dụng tự động bố trí. Đã thử Tạo UILabel nhưng chúng được tạo mỗi khi cellForRowAtIndex được khởi tạo. Đã thử rất nhiều thứ. Không có gì làm việc cho tôi. Bối cảnh của uilabel có cùng chiều rộng. Cứu giúp !!!
coreDeviOS

@Daniel Tôi đặt số dòng = 0, nhưng nó không hoạt động. Tôi đã thiết lập các ràng buộc của trung tâm theo chiều ngang và chiều dọc. Một điều nữa tôi đã làm là tạo một lớp con của UILABEL và sử dụng nó cho Nhãn đó
Jasmeet

Với Autolayout, giải pháp đơn giản nhất là: (1) Đặt các dòng thành 0, (2) Đặt ràng buộc về chiều rộng thành "Lớn hơn hoặc bằng" với Hằng số 0, (3) Đặt ràng buộc về chiều cao thành "Lớn hơn hoặc bằng" với Hằng số 0, ( 4) Căn chỉnh như bạn thường làm, ví dụ bằng cách căn giữa theo chiều ngang và chiều dọc.
Erik van der Neut

76

Sử dụng [label sizeToFit];sẽ đạt được kết quả tương tự từ hạng mục của Daniels.

Mặc dù tôi khuyên bạn nên sử dụng tính năng tự động thanh toán và để nhãn tự thay đổi kích thước dựa trên các ràng buộc.


3
Khi sử dụng swift, tôi phải chạy cái này trên luồng chính bằng cách sử dụng Clark_async (Clark_get_main_queue (), {});
Zeezer

@Zeezer bạn có biết tại sao không?
FurloSK

13
@FurloSK Mọi thay đổi trên ui phải được thực hiện trong luồng chính.
Guilherme Torres Castro

32

Nếu chúng ta muốn điều đó UILabel nên thu nhỏ và mở rộng dựa trên kích thước văn bản thì bảng phân cảnh với tính năng tự động thanh toán là lựa chọn tốt nhất. Dưới đây là các bước để đạt được điều này

Các bước

  1. Đặt UILabel trong trình điều khiển xem và đặt nó bất cứ nơi nào bạn muốn. Cũng đặt 0cho numberOfLinestài sản của UILabel.

  2. Cung cấp cho nó giới hạn pin hàng đầu, hàng đầu và Trailing.

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

  1. Bây giờ nó sẽ đưa ra cảnh báo, Nhấp vào mũi tên màu vàng.

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

  1. Bấm vào Update Framevà bấm vào Fix Misplacement. Bây giờ UILabel này sẽ co lại nếu văn bản ít hơn và mở rộng nếu văn bản nhiều hơn.

1
Tôi chưa thử nghiệm nội địa hóa, nhưng nó cũng hoạt động cho điều đó.
Yogesh Suthar

2
Tôi không thể làm điều này để làm việc với một dự án hiện có cho đến khi tôi bỏ chọn hộp kiểm "Độ rộng ưu tiên" "Rõ ràng", sau đó tất cả đều hoạt động tốt.
zorro2b

25

Điều này không phức tạp như một số câu trả lời khác làm cho nó.

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

Ghim các cạnh trái và trên cùng

Chỉ cần sử dụng bố cục tự động để thêm các ràng buộc để ghim bên trái và trên cùng của nhãn.

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

Sau đó nó sẽ tự động thay đổi kích thước.

Ghi chú

  • Đừng thêm các ràng buộc cho chiều rộng và chiều cao. Nhãn có kích thước nội tại dựa trên nội dung văn bản của chúng.
  • Nhờ câu trả lời này để được giúp đỡ với điều này.
  • Không cần thiết lập sizeToFitkhi sử dụng bố trí tự động. Mã hoàn chỉnh của tôi cho dự án ví dụ là ở đây:

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
  • Nếu bạn muốn nhãn của bạn bao bọc dòng thì đặt số dòng thành 0 trong IB và thêm myLabel.preferredMaxLayoutWidth = 150 // or whatevermã. (Tôi cũng ghim nút của mình xuống dưới cùng của nhãn để nó di chuyển xuống khi chiều cao nhãn tăng lên.)

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

  • Nếu bạn đang tìm kiếm các nhãn kích thước động trong một UITableViewCellthì hãy xem câu trả lời này .

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


Xin chào, tôi có nhãn đã thay đổi kích thước nhưng tôi không hiểu cách thay đổi kích thước chiều cao của ô. Bạn có thể vui lòng cho tôi biết làm thế nào để thay đổi kích thước chiều cao tế bào.
Vivek

@Vivek, miễn là bạn không có bất kỳ ràng buộc nào được đặt về chiều cao, nó sẽ tự động thay đổi kích thước.
Suragch

Có, nhưng Làm thế nào có thể khi tôi sử dụng ô tùy chỉnh và tôi đặt 2 nhãn vào ô của anh ấy.
Vivek

@Vivek, xin lỗi, tôi đọc sai câu hỏi của bạn. Bạn đã có một nhãn hiệu để làm việc bằng cách đi qua câu trả lời này ?
Suragch


5

Tôi đã tạo ra một số phương pháp dựa trên câu trả lời của Daniel ở trên.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

    CGSize expectedLabelSize    = [text sizeWithFont:label.font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:label.lineBreakMode];

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}

5

Đây là những gì tôi đang tìm kiếm hoạt động cho tình huống của tôi:

1) Chiều cao của UILabel có ràng buộc> = 0 bằng cách sử dụng tự động thanh toán. Chiều rộng là cố định. 2) Gán văn bản vào UILabel, đã có giám sát tại thời điểm đó (không chắc mức độ quan trọng của nó). 3) Sau đó, làm:

    label.sizeToFit()
    label.layoutIfNeeded()

Chiều cao của nhãn bây giờ được thiết lập phù hợp.


3
@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}

@end

Đây là phương pháp thể loại. Bạn phải đặt văn bản trước, hơn gọi phương thức này để điều chỉnh chiều cao của UILabel.


2

Bạn có thể định cỡ nhãn theo văn bản và các điều khiển liên quan khác bằng hai cách-

  1. Dành cho iOS 7.0 trở lên

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;

trước iOS 7.0, điều này có thể được sử dụng để tính kích thước nhãn

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

// điều chỉnh lại các điều khiển khác dựa trên nhãnTextHeight

CGFloat labelTextHeight = labelTextSize.height;
  1. Nếu bạn không muốn tính kích thước của văn bản của nhãn hơn bạn có thể sử dụng -sizeToFit trong trường hợp của UILabel như-

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text

// sau này, bạn có thể lấy khung nhãn để điều chỉnh lại các điều khiển liên quan khác


2
  1. Thêm các ràng buộc còn thiếu trong bảng phân cảnh.
  2. Chọn UILabel trong bảng phân cảnh và đặt thuộc tính "Line" thành 0.
  3. Tham chiếu Outlet UILabel sang Controller.h với id: nhãn
  4. Trình điều khiển.m và thêm [label sizeToFit];vào viewDidLoad

1

Tôi đã có một vấn đề lớn với bố trí tự động. Chúng tôi có hai container bên trong tế bào bảng. Container thứ hai được thay đổi kích thước tùy thuộc vào mô tả Mục (0 - 1000 ký tự) và hàng phải được thay đổi kích thước dựa trên chúng.

Các thành phần còn thiếu là hạn chế dưới cùng để mô tả.

Tôi đã thay đổi ràng buộc dưới cùng của phần tử động từ = 0 thành > = 0 .


Điều này đã cứu cuộc đời tôi. Nếu bạn đang cố gắng làm theo: github.com/honghaoz/ thì đây là câu trả lời đúng.
Justin Fyles

0

Phù hợp mọi lúc! :)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];

0

bạn có thể hiển thị một đầu ra dòng sau đó đặt thuộc tính Line = 0 và hiển thị nhiều đầu ra dòng sau đó đặt thuộc tính Line = 1 trở lên

[self.yourLableName sizeToFit];

-1

Cũng có cách tiếp cận này:

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];

Không phải tôi là người đánh giá thấp câu trả lời này nhưng tôi chỉ muốn chỉ ra rằng tôi không thể thấy một changeTextWithAutoHeight:width:phương pháp nào UILabel. Bạn có thể cung cấp một liên kết xin vui lòng đến nơi trong tài liệu UIKit phương pháp này có thể được tìm thấy.
Adil Hussain
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.