如何计算基于文本长度的UILabel宽度?

我想在UILabel旁边显示图像,但是UILabel具有可变的文本长度,所以我不知道在哪里放置图像。 我怎样才能做到这一点?

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

Objective-C / Swift的 yourLabel.intrinsicContentSize.width

迅速

  yourLabel.intrinsicContentSize().width 

所选答案在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而不是CGSize 。 希望对于在iOS 7中使用它的人有一些帮助。

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

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

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

 - NSForegroundColorAttributeName - NSParagraphStyleAttributeName - NSBackgroundColorAttributeName - NSShadowAttributeName 

等等。 但是可能你不需要别人

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

这是我在应用其他SOpost的一些原则后提出的,包括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的大小。 它还在视图的左侧添加了一个图像,所以您会看到一些pipe理适当间距的代码来处理图像和填充。

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

尽pipe亚伦的答案对某些人有效,但对我来说却行不通。 这是一个更详细的解释,你应该去任何其他地方之前立即尝试,如果你想要一个图像和可resize的UILabel更dynamic的看法。 我已经为你做了所有的工作!