ios 如何根据文本长度计算 UILabel 宽度?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3527494/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to calculate UILabel width based on text length?
提问by Sheehan Alam
I want to display an image next to a UILabel, however UILabel has variable text length, so I don't know where to place the image. How can I accomplish this?
我想在 UILabel 旁边显示一个图像,但是 UILabel 的文本长度可变,所以我不知道将图像放在哪里。我怎样才能做到这一点?
回答by Aaron Saunders
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
What is -[NSString sizeWithFont:forWidth:lineBreakMode:] good for?
-[NSString sizeWithFont:forWidth:lineBreakMode:] 有什么用?
this question might have your answer, it worked for me.
这个问题可能有你的答案,它对我有用。
For 2014, I edited in this new version, based on the ultra-handy comment by Norbert below! This does everything. Cheers
2014 年,我在这个新版本中进行了编辑,基于下面诺伯特的超方便评论!这无所不能。干杯
// 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);
回答by Jakub Truhlá?
yourLabel.intrinsicContentSize.width
for Objective-C / Swift
yourLabel.intrinsicContentSize.width
用于Objective-C / Swift
回答by Arshad
In swift
在迅速
yourLabel.intrinsicContentSize().width
回答by Chetan Shenoy
The selected answer is correct for iOS 6 and below.
所选答案适用于 iOS 6 及以下版本。
In iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:
has been deprecated. It is now recommended you use boundingRectWithSize:options:attributes:context:
.
在 iOS 7 中,sizeWithFont:constrainedToSize:lineBreakMode:
已弃用. 现在建议您使用boundingRectWithSize:options:attributes:context:
.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
Note that the return value is a CGRect
not a CGSize
. Hopefully that'll be of some assistance to people using it in iOS 7.
请注意,返回值CGRect
不是 a CGSize
。希望这对在 iOS 7 中使用它的人有所帮助。
回答by jarora
In iOS8 sizeWithFont has been deprecated, please refer to
在 iOS8 中 sizeWithFont 已被弃用,请参考
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
You can add all the attributes you want in sizeWithAttributes. Other attributes you can set:
您可以在 sizeWithAttributes 中添加您想要的所有属性。您可以设置的其他属性:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
and so on. But probably you won't need the others
等等。但可能你不需要其他人
回答by iOS Lifee
Swift 4 Answer who are using Constraint
Swift 4 Answer who is using Constraint
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 Answer who are using Constraint
使用约束的 Swift 5 答案
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
回答by Honey Lakhani
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
回答by whyoz
Here's something I came up with after applying a few principles other SO posts, including Aaron's link:
这是我在应用其他 SO 帖子(包括 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];
In this example, I'm adding a custom pin to a MKAnnotation class that resizes a UILabel according to the text size. It also adds an image on the left side of the view, so you see some of the code managing the proper spacing to handle the image and padding.
在此示例中,我将自定义 pin 添加到 MKAnnotation 类,该类根据文本大小调整 UILabel 的大小。它还在视图的左侧添加了一个图像,因此您会看到一些管理适当间距以处理图像和填充的代码。
The key is to use CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
and then redefine the view's dimensions. You can apply this logic to any view.
关键是使用CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
然后重新定义视图的尺寸。您可以将此逻辑应用于任何视图。
Although Aaron's answer works for some, it didn't work for me. This is a far more detailed explanation that you should try immediately before going anywhere else if you want a more dynamic view with an image and resizable UILabel. I already did all the work for you!!
尽管 Aaron 的答案对某些人有效,但对我不起作用。这是一个更详细的解释,如果您想要一个带有图像和可调整大小的 UILabel 的更动态的视图,您应该在去其他任何地方之前立即尝试。我已经为你做了所有的工作!!