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