美文网首页iOS开发知识
手把手教你怎么使用boundingRectWithSize来实现

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

作者: 太阳骑士索拉尔 | 来源:发表于2019-03-05 21:29 被阅读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的高度了
    

    第一次失败的尝试

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

    第二次成功的尝试

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

    具体代码

    相关文章

      网友评论

        本文标题:手把手教你怎么使用boundingRectWithSize来实现

        本文链接:https://www.haomeiwen.com/subject/husauqtx.html