如何动态计算UILabel高度

我有以下代码:

label.numberOfLines = 0; // allows label to have as many lines as needed label.text = @"some long text"; [label sizeToFit]; 

如何获得标签的高度?

使用以下方法计算动态UILabel高度:

 - (CGFloat)getLabelHeight:(UILabel*)label { CGSize constraint = CGSizeMake(label.frame.size.width, CGFLOAT_MAX); CGSize size; NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init]; CGSize boundingBox = [label.text boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:label.font} context:context].size; size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height)); return size.height; } 

获得高度的最简单方法是sizeThatFits 。 像这样用它:

Objective-C的

 CGFloat maxLabelWidth = 100; CGSize neededSize = [label sizeThatFits:CGSizeMake(maxLabelWidth, CGFLOAT_MAX)]; 

Swift 3.0

 let maxLabelWidth: CGFloat = 100 let neededSize = label.sizeThatFits(CGSize(width: maxLabelWidth, height: CGFloat.greatestFiniteMagnitude)) 

标签需要的高度需要neededSize.height 。高度。
请注意,我使用CGFLOAT_MAX作为大小高度,以确保标签有足够的位置适合CGSize

标签的高度还取决于标签的宽度,这就是我添加maxLabelWidth ,如果标签宽度为100pt或200pt,则会有所不同。

希望这可以帮助!

编辑:确保设置label.numberOfLines = 0; 否则neededSize返回文本在一行中的大小。

编辑:添加了Swift版本,虽然命名有点奇怪,但是greatFiniteMagnitude似乎是CGFLOAT_MAX的正确等价物。

只需使用[label sizeThatFits:label.frame.size]; 它将返回适合给定文本的标签大小。 或者你也可以关注这个问题

对于那些想要估计标签大小的人来说,在UICollectionView或UITableView中估计标题/单元格高度的方法,请按照下列步骤操作:

  1. 设置标签将采用的maxWidth
  2. 创建一个新的UILabel并将numberOfLines设置为0
  3. 如果使用自定义字体,请添加自定义字体名称和字体大小等字体属性
  4. 设置此标签的文本并使用sizeThatFits获取估计的高度。 标签高度需要高度。高度

Swift版本

 let maxLabelWidth:CGFloat = collectionView.frame.width - 20 let label = UILabel() label.numberOfLines = 0 let addressFont = [ NSFontAttributeName: UIFont(name: "OpenSans", size: 12.0)! ] let addr = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." label.attributedText = NSMutableAttributedString(string: addr , attributes: addressFont ) let neededSize:CGSize = label.sizeThatFits(CGSizeMake(maxLabelWidth, CGFloat.max)) let labelHeight = neededSize.height 

感谢@FabioBerger

我对Salman Zaidi的回答进行了一些编辑,以使其更适合自己。 如果您无法直接访问标签,例如当您尝试在heightForRowAtIndexPath:获取标签高度时,它的效果很好heightForRowAtIndexPath:

 -(CGFloat)getLabelHeight:(CGSize)labelSize string: (NSString *)string font: (UIFont *)font{ CGSize size; NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init]; CGSize boundingBox = [string boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:context].size; size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height)); return size.height; } 

我调整高度, label有2行

lblUserQuestion.preferredMaxLayoutWidth = 100.0f;

100.0f,它是我想要的尺寸,另一条线,

[lblUserQuestion sizeToFit];

我的方法完成了,

 UILabel *lblUserQuestion = [[UILabel alloc] initWithFrame:CGRectMake(61, 25, self.frame.size.width-61-20, 37.0f)]; lblUserQuestion.numberOfLines= 0; lblUserQuestion.font =[UIFont fontWithName:@"HelveticaNeue-Thin" size:14.]; lblUserQuestion.adjustsFontSizeToFitWidth = YES; lblUserQuestion.minimumScaleFactor = 0.5; lblUserQuestion.preferredMaxLayoutWidth= 100.0f; lblUserQuestion.text = _photoToVote.label; 

您可以动态创建标签:

 -(CGRect)newLableSize:(NSString *)lableString { NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping]; CGFloat tempwidth = YourStaticLabelWidth * ScreenWidth / 320; NSMutableArray *array=[[NSMutableArray alloc]initWithObjects: lableString,nil]; CGRect newLabelsize = [[array objectAtIndex:0] boundingRectWithSize:CGSizeMake(tempwidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:selectFont,NSParagraphStyleAttributeName:paragraphStyle} context:nil]; NSLog(@"New Label Size Width : %f",newLabelsize.size.width); NSLog(@"New Label Size Height : %f",newLabelsize.size.height); return newLabelsize; } 
 - (CGFloat)getTextHeightByWidth:(NSString*)text textFont:(UIFont*)textFont textWidth:(float)textWidth { if (!text) { return 0; } CGSize boundingSize = CGSizeMake(textWidth, CGFLOAT_MAX); NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{ NSFontAttributeName: textFont }]; CGRect rect = [attributedText boundingRectWithSize:boundingSize options:NSStringDrawingUsesLineFragmentOrigin context:nil]; CGSize requiredSize = rect.size; return requiredSize.height; } - (CGFloat)getTextWidthByHeight:(NSString*)text textFont:(UIFont*)textFont textHeight:(float)textHeight { if (!text) { return 0.0f; } CGSize boundingSize = CGSizeMake(CGFLOAT_MAX, textHeight); NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{ NSFontAttributeName: textFont }]; CGRect rect = [attributedText boundingRectWithSize:boundingSize options:NSStringDrawingUsesLineFragmentOrigin context:nil]; CGSize requiredSize = rect.size; return requiredSize.width; } 
  - (CGFloat)getLabelsize:(UILabel *)label { CGSize maxSize = CGSizeMake(label.frame.size.width, 9999); CGSize requiredSize = [label sizeThatFits:maxSize]; return requiredSize.height; } 

使用此function

 + (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width { CGSize constraint = CGSizeMake(width, 20000.0f); CGSize size; CGSize boundingBox = [text boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size; size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height)); return size.height; } 
Interesting Posts