如何根据文本长度计算UILabel宽度?


Answers:


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

-[NSString sizeWithFont:forWidth:lineBreakMode:]有什么用?

这个问题可能有您的答案,对我有用。


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);

41
请注意:自iOS7起已弃用此功能。现在首选的方式是:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert

17
您也可以使用IntrinsicContentSize属性。我对Objective-c的了解不多,但是应该是这样的:self.yourLabel.intrinsicContentSize 这将为您提供标签内容的大小,因此您可以从那里获取宽度。
鲍里斯(Boris)2014年

1
yourLabel.intrinsicContentSize.width工作的下面大,检查答案。
denis_lor

155

yourLabel.intrinsicContentSize.width用于Objective-C / Swift


对我不起作用,它不是根据其文本计算标签的宽度高度
Chandni,

1
使用自定义字体,对我来说也很完美!
fl034

1
获得动态标签宽度的完美答案
Chetan


33

所选答案适用于iOS 6及以下版本。

在iOS 7中,sizeWithFont:constrainedToSize:lineBreakMode:弃用。现在建议您使用boundingRectWithSize:options:attributes:context:

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

请注意,返回值CGRect不是a CGSize。希望这会对在iOS 7中使用它的人们有所帮助。


12

在iOS8中,sizeWithFont已被弃用,请参阅

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

您可以在sizeWithAttributes中添加所需的所有属性。您可以设置的其他属性:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

等等。但也许您不需要其他人


10

Swift 4 Answer谁在使用约束

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正在使用约束

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
大!方便根据文本计算UIButton的宽度,而internalContentSize.width并不总是正常工作。
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
这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,就可以在任何帖子中发表评论
卑鄙的老鼠

此答案告诉您如何根据文本调整标签大小。这是什么问题?
Honey Lakhani 2015年

2

在应用了一些其他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];

在此示例中,我向MKAnnotation类添加了一个自定义图钉,该图根据文本大小来调整UILabel的大小。它还在视图的左侧添加了图像,因此您会看到一些代码,这些代码管理适当的间距以处理图像和填充。

关键是使用CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];然后重新定义视图的尺寸。您可以将此逻辑应用于任何视图。

尽管亚伦的答案对某些人有用,但对我却不起作用。这是一个更详细的解释,如果您想使用图像和可调整大小的UILabel获得更动态的视图,则应在尝试其他任何操作之前立即尝试。我已经为您完成了所有工作!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.