手把手教你怎么使用boundingRectWithSize来实现
2019-03-05 本文已影响1人
太阳骑士索拉尔
前言
- 之前写的用[label sizeToFit]去实现cell高度自适应, 事实证明效率太低,并不是很OK
- 这次换用boundingRectWithSize去实现,提升效率,但在路上也是遇到了很多挫折,写这篇博客记录下心路历程
参考文章
方法使用介绍
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSAttributedStringKey, id> *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
size:宽度写给定的label宽度,高度因为不确定,建议写CGFLOAT_MAX(代表无穷大)
attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:17]} 这里可以写字号
剩下的可以看参考文章了解下
我的使用
+ (CGFloat)getCellHeight:(NSString *)content {
CGRect rect = [content boundingRectWithSize:CGSizeMake(kDeviceWidth - (kBigInterval * 2 + 30 + kLittleInterval), CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:17]} context:nil];
return ceilf(rect.size.height) + 3 * kBigInterval + kMainTextHeight + kDateTextHeight + kLittleInterval;
}
//这是我写的计算cell高度的方法,本质上就是算出传入字符串content在该宽度下的高度,并以此高度作为label的高度,在最后加上其他固定控件的高度,就能得出cell的高度了
第一次失败的尝试
- 实现可以看我的思维导图
- 在cell的布局里面,给label设置高度我是再用整个cell的高度减去其他控件的高度得出来
- 这里就有个问题,看过我前面讲cell高度自适应博客的人会知道,我是现将所有高度算出来存在数组里作为缓存,只要调用就行的
- 可这里因为设置label高度的时候就使用了cell的高度,导致先有鸡还是先有蛋的问题(这一段有点难懂,因为第一次的代码现在没了。。。。大家懂意思就行)
- 所以我得在heightForRowAtIndexPath去计算cell高度,影响效率
- 其次,本来我的自定义cell并没有写layoutSubviews,全是写在一起的
- 一切的好好的,可那个label高度设置就得写在layoutSubviews里,这一点让我百思不得其解
- 另外经常出现约束错误bug,高度各种鬼畜,于是第一次尝试以失败告终
第二次成功的尝试
- 这个来自于我的一个发现:原来根本不用设置label的高度,都不用写这句话,label会自己调整。。。。
- 然后接下来一切也就顺理成章了,也就是普普通通的缓存之类的,可以看我上一篇讲cell高度的文章
具体代码
- zhihu-daily-Imitation
- 主要在ZDICommitPageTableViewCell.m里的getCellHeight方法来计算高度