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

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

59 0

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

时间: 15年08月06日 原作者: Peter Hosey

118 0

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


发布时间: 15年08月06日 原作者: Joe Blow
29 0

选中的答案对 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中使用它的人们有所帮助。

发布时间: 15年08月06日 原作者: Chetan Shenoy
4 0

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

发布时间: 15年08月06日 原作者: Jakub Truhlář
2 0

iOS8 sizeWithFont已经被否决,请参考


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


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


- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName


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

发布时间: 15年08月06日 原作者: jarora
1 0

下面是我在应用一些其他的原则之后提出的一些原则,包括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 。 我已经为你做了所有的工作 !

发布时间: 15年08月06日 原作者: whyoz
1 0

在 Swift 中


 yourLabel.intrinsicContentSize().width 


发布时间: 15年08月06日 原作者: Arshad
...