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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 17:35:18  来源:igfitidea点击:

How to calculate UILabel width based on text length?

iosobjective-cswiftuikituilabel

提问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.widthfor 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 CGRectnot 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 的更动态的视图,您应该在去其他任何地方之前立即尝试。我已经为你做了所有的工作!!