UIlabel文本计算

一、boundingRectWithSize计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//UILabel分类方法
- (CGSize)sizeWithFont:(UIFont *)font maxSize:(CGSize)maxSize
{
CGSize retSize =CGSizeZero;
if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])
{
NSDictionary *attributeDic = @{NSFontAttributeName:font};
NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine;
retSize = [self boundingRectWithSize:CGSizeMake(maxSize.width, maxSize.height)
options:options
attributes:attributeDic
context:nil].size;
}
return CGSizeMake(ceil(retSize.width),
ceil(retSize.height));
}

二、sizeThatFits方式计算

1
2
3
4
5
6
7
//UILabel分类方法
- (CGSize)preferredSizeWithMaxWidth:(CGFloat)maxWidth
{
CGSize size = [self sizeThatFits:CGSizeMake(maxWidth, MLFLOAT_MAX)];
size.width = fmin(size.width, maxWidth); //在numberOfLine=1返回值可能会比maxWidth大
return size;
}

如果是富文本的话,比如包含表情等,使用boundingRectWithSize计算误差就比较大了,所以建议使用sizeThatFits方式计算。

如果在UITableviewCell中需要计算cell高度,不方便获取label实例,我们可以使用一个单例Label来计算高度,减少label实例化带来的性能消耗。

1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma mark --获取Label高度用--
static UILabel * kProtypeLabel() {
static UILabel *_protypeLabel = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_protypeLabel = [[UILabel alloc]init];
_protypeLabel.font=[UIFont systemFontOfSize:16.0f];
_protypeLabel.numberOfLines = 0;
_protypeLabel.lineBreakMode=NSLineBreakByCharWrapping;
//_protypeLabel.textInsets = UIEdgeInsetsMake(5, 5, 5,5);
});
return _protypeLabel;
}

获取size

1
2
3
4
5
6
7
8
#pragma mark --计算富文本高度
#define KMaxWidth 200
+(CGSize)labelSizeWithText:(NSString *)text;
{
UILabel *label = kProtypeLabel();
label.text=text;
return [label preferredSizeWithMaxWidth:KMaxWidth]; //上下间距
}
文章作者: kyren
文章链接: http://huluo666.github.io/2018/02/28/UILabel计算Size/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kyren's Blog