我想在 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);
下面是我在应用了一些原则后得出的结论,包括亚伦的链接:
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];
在这个示例中,我将向 MKAnnote 类添加一个自定义别针,该类根据文本大小调整 UILabel 的大小。它还在视图的左侧添加了一个图像,因此您可以看到一些管理适当间距以处理图像和填充的代码。
关键是使用 CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];,然后重新定义视图的尺寸。您可以将此逻辑应用于任何视图。
CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
虽然亚伦的回答对某些人有用,但对我没用。这是一个更加详细的解释,如果您想要一个带有图像和可调整大小的 UILabel 的更加动态的视图,那么您应该在去其他地方之前立即尝试这个解释。我已经为你做了所有的工作! !
所选择的答案对于 iOS6及以下版本是正确的。
在 iOS7中,sizeWithFont:constrainedToSize:lineBreakMode:是 不赞成,现在推荐使用 boundingRectWithSize:options:attributes:context:。
sizeWithFont:constrainedToSize:lineBreakMode:
boundingRectWithSize:options:attributes:context:
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect options:<NSStringDrawingOptions> attributes:@{ NSFontAttributeName: yourString.font AnyOtherAttributes: valuesForAttributes } context:(NSStringDrawingContext *)];
请注意,返回值是 CGRect而不是 CGSize。希望这对于在 iOS7中使用它的人们有所帮助。
CGRect
CGSize
yourLabel.intrinsicContentSize.width呼叫 目标-C/Swift
yourLabel.intrinsicContentSize.width
在 iOS8中,sizeWithFont 已被弃用,请参阅
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
可以在 sizeWithAttritribute 中添加所需的所有属性。 其他可以设置的属性:
- NSForegroundColorAttributeName - NSParagraphStyleAttributeName - NSBackgroundColorAttributeName - NSShadowAttributeName
等等。但是可能你不需要其他的
迅速
yourLabel.intrinsicContentSize().width
CGRect rect = label.frame; rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}]; label.frame = rect;
Swift 4回答谁在使用约束
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回答谁在使用约束
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