Làm cách nào để tính chiều rộng UILabel dựa trên chiều dài văn bản?


142

Tôi muốn hiển thị hình ảnh bên cạnh UILabel, tuy nhiên UILabel có độ dài văn bản thay đổi, vì vậy tôi không biết đặt hình ảnh ở đâu. Làm thế nào tôi có thể thực hiện điều này?

Câu trả lời:


191
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

- [NSString sizeWithFont: forWidth: lineBreakMode:] dùng để làm gì?

Câu hỏi này có thể có câu trả lời của bạn, nó đã làm việc cho tôi.


Trong năm 2014, tôi đã chỉnh sửa trong phiên bản mới này, dựa trên nhận xét cực kỳ tiện dụng của Norbert bên dưới! Điều này làm mọi thứ. Chúc mừng

// yourLabel is your UILabel.

float widthIs = 
 [self.yourLabel.text
  boundingRectWithSize:self.yourLabel.frame.size                                           
  options:NSStringDrawingUsesLineFragmentOrigin
  attributes:@{ NSFontAttributeName:self.yourLabel.font }
  context:nil]
   .size.width;

NSLog(@"the width of yourLabel is %f", widthIs);

41
Chỉ cần một lưu ý: điều này không được chấp nhận kể từ iOS7. Cách ưa thích bây giờ là:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert

17
Bạn cũng có thể sử dụng thuộc tính IntrinsicContentSize. Tôi không quan tâm nhiều đến Objective-c, nhưng nó phải giống như thế này: self.yourLabel.intrinsicContentSize Điều này sẽ cung cấp cho bạn kích thước của nội dung nhãn, vì vậy bạn có thể lấy chiều rộng từ đó.
Boris

1
Chỉ cần yourLabel.intrinsicContentSize.widthlàm việc tuyệt vời, kiểm tra câu trả lời dưới đây.
denis_lor

155

yourLabel.intrinsicContentSize.widthcho Mục tiêu-C / Swift


không hoạt động đối với tôi, nó không tính chiều cao chiều rộng của nhãn trên cơ sở văn bản của chúng
Chandni

1
Hoạt động hoàn hảo cho tôi, với phông chữ tùy chỉnh cũng!
fl034

1
câu trả lời hoàn hảo để có được chiều rộng của nhãn động
Chetan

52

Trong nhanh chóng

 yourLabel.intrinsicContentSize().width 

3
Câu trả lời này chỉ có giá trị cho một quan điểm đã được đặt ra
rommex

33

Câu trả lời được chọn là chính xác cho iOS 6 trở xuống.

Trong iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:đã bị phản đối . Bây giờ bạn nên sử dụng boundingRectWithSize:options:attributes:context:.

CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
                                                    options:<NSStringDrawingOptions>
                                                 attributes:@{
                                                    NSFontAttributeName: yourString.font
                                                    AnyOtherAttributes: valuesForAttributes
                                                 }
                                                    context:(NSStringDrawingContext *)];

Lưu ý rằng giá trị trả về CGRectkhông phải là a CGSize. Hy vọng rằng sẽ có một số trợ giúp cho những người sử dụng nó trong iOS 7.


12

Trong kích thước iOS8WithFont không được dùng nữa, vui lòng tham khảo

CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];

Bạn có thể thêm tất cả các thuộc tính bạn muốn trong sizeWithAttribut. Các thuộc tính khác bạn có thể đặt:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

và như thế. Nhưng có lẽ bạn sẽ không cần những người khác


10

Swift 4 Trả lời những người đang sử dụng ràng buộc

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet

Swift 5 Trả lời những người đang sử dụng ràng buộc

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(withAttributes: [NSAttributedString.Key.font: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet

1
Tuyệt quá! Thuận tiện cho việc tính toán độ rộng của UIButton theo văn bản, trong đó intinsicContentSize. Thong không luôn hoạt động chính xác.
nomnom

8
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;

2
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào .
Con chuột khiêm tốn

Câu trả lời này cho biết làm thế nào để điều chỉnh kích thước nhãn theo văn bản. vấn đề ở đây là gì?
Mật ong Lakhani

2

Đây là điều tôi nghĩ ra sau khi áp dụng một vài nguyên tắc khác cho các bài đăng SO khác, bao gồm liên kết của Aaron:

    AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

    self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
    self.backgroundColor = [UIColor greenColor];
    self.frame = CGRectMake(0,0,30,30);
    imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
    imageView.frame = CGRectMake(3,3,20,20);
    imageView.layer.masksToBounds = NO;
    [self addSubview:imageView];
    [imageView release];

    CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
    CGRect newFrame = self.frame;
    newFrame.size.height = titleSize.height + 12;
    newFrame.size.width = titleSize.width + 32;
    self.frame = newFrame;
    self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
    self.layer.borderWidth = 3.0;

    UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
    infoLabel.text = myAnnotation.title;
    infoLabel.backgroundColor = [UIColor clearColor];
    infoLabel.textColor = [UIColor blackColor];
    infoLabel.textAlignment = UITextAlignmentCenter;
    infoLabel.font = [UIFont systemFontOfSize:12];

    [self addSubview:infoLabel];
    [infoLabel release];

Trong ví dụ này, tôi đang thêm một pin tùy chỉnh vào lớp MKAnnotation thay đổi kích thước một UILabel theo kích thước văn bản. Nó cũng thêm một hình ảnh ở phía bên trái của khung nhìn, vì vậy bạn thấy một số mã quản lý khoảng cách phù hợp để xử lý hình ảnh và phần đệm.

Chìa khóa là sử dụng CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];và sau đó xác định lại kích thước của chế độ xem. Bạn có thể áp dụng logic này cho bất kỳ chế độ xem nào.

Mặc dù câu trả lời của Aaron có hiệu quả với một số người, nhưng nó không hiệu quả với tôi. Đây là một lời giải thích chi tiết hơn nhiều mà bạn nên thử ngay lập tức trước khi đi bất cứ nơi nào khác nếu bạn muốn có một cái nhìn năng động hơn với một hình ảnh và UILabel có thể thay đổi kích thước. Tôi đã làm tất cả các công việc cho bạn !!

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.