95 可读性
将光标移到/点击文章中的句子上,可以查看原文。 显示译文      显示原文      双语对照

基于文本长度,如何计算uilabel宽度?

我想在UILabel旁边显示一个图像,但是UILabel有可变文本长度,所以我不知道在哪里放置图像。 如何完成这里操作?

时间: 原作者: 6个回答


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


什么是- [NSString sizeWithFont:forWidth:lineBreakMode:] 好

这个问题可能有你的答案,它为我工作。


2014年,我在这个新版本中编辑了,基于下面的ultra-handy评论 ! 这是一切,干杯


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


原作者:

选中的答案对 iOS 6和更高版本是正确的。

在 iOS 7中, sizeWithFont:constrainedToSize:lineBreakMode: 已经 deprecate 现在建议你使用 boundingRectWithSize:options:attributes:context:


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


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

原作者:

使用: yourLabel.intrinsicContentSize.width; 请注意它的iOS 6 +

原作者:

iOS8 sizeWithFont已经被否决,请参考


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


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


- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName


等等,但可能你不需要其他人

原作者:

下面是我在应用一些其他的原则之后提出的一些原则,包括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]]; 然后重新定义视图的尺寸。 你可以将这里逻辑应用到任何视图。

虽然aaron的答案对某些人有用,但对我来说却不起作用。 这是一个更详细的解释,你应该在其他地方尝试,如果你想要一个更动态的图像和可以调整大小的UILabel 。 我已经为你做了所有的工作 !

原作者:

在 Swift 中


 yourLabel.intrinsicContentSize().width 


原作者:
...