iOS UILabel文本高度计算

boundingRectWithSize计算文本高度 

CGRect stringRect = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT)

options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)

attributes:@{ NSFontAttributeName : font }

context:nil];

size: 自适应尺寸,提供一个宽度,去自适应高度。

options:文本绘制时的附加选项,NSStringDrawingOptions有四种类型:

1.NSStringDrawingTruncatesLastVisibleLine

2.NSStringDrawingUsesLineFragmentOrigin

3.NSStringDrawingUsesFontLeading

4.NSStringDrawingUsesDeviceMetrics

通常使用NSStringDrawingUsesLineFragmentOrigin,释义为:整个文本将以每行组成的矩形为单位计算整个文本的尺寸。

NSStringDrawingUsesFontLeading,释义为:使用字体的行间距来计算文本占用的范围,即每一行的底部到下一行的底部的距离计算。

NSStringDrawingUsesDeviceMetric,释义为:将文字以图像符号计算文本占用范围,而不是以字符计算。也即是以每一个字体所占用的空间来计算文本范围。

NSStringDrawingTruncatesLastVisibleLine,释义为:当文本不能适合的放进指定的边界之内,则自动在最后一行添加省略符号。如果NSStringDrawingUsesLineFragmentOrigin没有设置,则该选项不生效。

attributes:根本文字的哪一种属性来进行计算。

context:绘制文本上下文, 一般传nil采用系统默认。

举例子:

//参数1:UILabel的大小

//参数2:UILabel上文字内容

//参数3:文字的字体大小

- (CGSize)labelRectWithSize:(CGSize)size LabelText:(NSString *)labelText Font:(UIFont *)font

{

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];

CGSize actualsize = [labelText boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:dic      context:nil].size; return actualsize;

}

//设置UILabel宽度和高度

- (CGSize)setLabelWidthWithHeight:(NSString *)str font:(UIFont*)font with:(CGFloat)width with:(CGFloat)height

{

CGSize size1 = CGSizeMake(width, height);

//获取当前文本的属性

NSDictionary *tdic = [NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName,nil];

CGSize labelSize = [str boundingRectWithSize:size1 options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:tdic context:nil].size;

return labelSize;

}

// 将UILabel根据内容自适应宽度变化,但高度是固定的,为30。

- (CGSize)sizeWithString:(NSString *)string font:(UIFont *)font

{

CGRect rect = [string boundingRectWithSize:CGSizeMake(MAXFLOAT, 30)options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font}context:nil];

return rect.size;

}

更新:

以上的方法,在使用过程中,尤其是在带有富文本的文本高度计算中会出现问题,于是做了以下方法处理,在文本一行和多行的情况下分别作处理:

/**

根据文本内容计算高度,并设置行间距、字体名称、限制宽高组成富文本,显示在UILabel上

@param text 文本内容

@param lineSpace 行间距

@param fontName 字体名称

@param size 文本内容的限制宽高

@param label 文本内容显示的label

@return 内容高度

*/

- (CGFloat )calculateLabelHeightWithText:(NSString *)text lineSpace:(NSInteger )lineSpace fontName:(UIFont *)fontName size:(CGSize )size label:(UILabel *)label

{

CGFloat height = 0;

if (text.length > 0) {

// 计算内容高度,判断显示几行

NSString *firstWord = [text substringToIndex:1];

CGFloat oneRowHeight = [firstWord sizeWithAttributes:@{NSFontAttributeName:fontName}].height;

NSDictionary *attributes = @{NSFontAttributeName:fontName};

CGSize textSize = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;

CGFloat rows = textSize.height / oneRowHeight;

if (rows == 1) {

lineSpace = 0;

height = oneRowHeight;

} else if (rows > 1) {

height = (oneRowHeight + lineSpace) * rows;

}

if (label) {

NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:text];

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];

[paragraphStyle setLineSpacing:lineSpace];

[string addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0,text.length)];

[label setAttributedText:string];

}

}

return height;

}

你可能感兴趣的:(iOS UILabel文本高度计算)