如何计算基于文本长度的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的看法。 我已经为你做了所有的工作!