iOS开发知识

手把手教你怎么使用boundingRectWithSize来实现

2019-03-05  本文已影响1人  太阳骑士索拉尔

前言

参考文章

方法使用介绍

- (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,高度各种鬼畜,于是第一次尝试以失败告终

第二次成功的尝试

具体代码

上一篇下一篇

猜你喜欢

热点阅读