Câu trả lời:
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);
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ừ đó.
yourLabel.intrinsicContentSize.width
làm việc tuyệt vời, kiểm tra câu trả lời dưới đây.
yourLabel.intrinsicContentSize.width
cho Mục tiêu-C / Swift
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ề CGRect
khô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.
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
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
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Đâ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 !!
[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];