手把手教你怎么使用boundingRectWithSize来实现cell的高度自适应

版权声明:欢迎指出错误,作者极懒,常常懒得修改 https://blog.csdn.net/KevinAshen/article/details/84929528

前言

  • 之前写的用[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的高度了

第一次失败的尝试

  1. 实现可以看我的思维导图
  2. 在cell的布局里面,给label设置高度我是再用整个cell的高度减去其他控件的高度得出来
  3. 这里就有个问题,看过我前面讲cell高度自适应博客的人会知道,我是现将所有高度算出来存在数组里作为缓存,只要调用就行的
  4. 可这里因为设置label高度的时候就使用了cell的高度,导致先有鸡还是先有蛋的问题(这一段有点难懂,因为第一次的代码现在没了。。。。大家懂意思就行)
  5. 所以我得在heightForRowAtIndexPath去计算cell高度,影响效率
  6. 其次,本来我的自定义cell并没有写layoutSubviews,全是写在一起的
  7. 一切的好好的,可那个label高度设置就得写在layoutSubviews里,这一点让我百思不得其解
  8. 另外经常出现约束错误bug,高度各种鬼畜,于是第一次尝试以失败告终

第二次成功的尝试

  • 这个来自于我的一个发现:原来根本不用设置label的高度,都不用写这句话,label会自己调整。。。。
  • 然后接下来一切也就顺理成章了,也就是普普通通的缓存之类的,可以看我上一篇讲cell高度的文章

第一次尝试的思维导图

猜你喜欢

转载自blog.csdn.net/KevinAshen/article/details/84929528