美文网首页
SDAutoLayout和FDTemplateLayoutCel

SDAutoLayout和FDTemplateLayoutCel

作者: 绿绿清欢 | 来源:发表于2017-08-30 18:50 被阅读80次

    SDAutoLayout和UITableView+FDTemplateLayoutCell两者在Github上的收藏量都不错,对于两者实现自动计算cell高度的机制却不同。

    17年的秋天感觉要来了呀.jpg

    SDAutoLayout

    SDAutoLayout采用的是自己手动计算cell所有组件的高度,并相加得到cell的高度;那在什么时候计算cell其他组件的高度比较合适呢?就是在每次系统调用LayoutSubviews的时候,获取你在自定义cell里调用setupAutoHeightWithBottomView时设置的bottomView的的最大Y值(如果你有设置bottomMargin的话,还需要加上bottomMargin)
    关键部分代码:

     if ([cell isKindOfClass:[UITableViewCell class]]) {
            CGFloat height = 0;
            for (UIView *view in cell.sd_bottomViewsArray) {
                height = MAX(height, view.bottom_sd);
            }
            cell.autoHeight = height + cell.sd_bottomViewBottomMargin;
        }
    

    UITableView+FDTemplateLayoutCell

    UITableView+FDTemplateLayoutCell则是采用了系统提供的方法获得的高度
    主要分为以下两种情况:

    1. 采用Frame布局,而没有使用Auto Layout时(不清楚Frame布局和AutoLayout的区别的,请参看iOS frame布局与自动布局有什么区别呢?
     fittingHeight = [cell sizeThatFits: CGSizeMake(contentViewWidth, 0)].height;
    

    这里fittingheight就是指的cell内容的高度,contentViewWidth是你内容设置的宽度

    2.采用AutoLayout布局后,计算cell高度就是采用了Apple提供的systemLayoutSizeFittingSize方法

    fittingHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    

    这两者都采用了高度缓存的机制来减少高度的计算,效率都不错;不过用原生xib,设置好constraints也能达到不错的高度自适应的效果。

    最后发现个小问题,layoutSubviews有一种触发调用机制是在scrollView上滑动的时候,就会触发,因为滑动的时候view的bounds改变了,这样SDAutoLayout每次在layoutSubview里做的计算和处理不知道是否过于频繁;性能尚未检测,等待后续更新

    对于LayoutSubviews调用有疑问,可以查看stackoverflow上这个问题:When is layoutSubviews called?

    本博客将会每两周至少更新一篇,觉得这篇文章对你有帮助的话,请关注哦,有问题可以及时交流;QQ:3145594262

    相关文章

      网友评论

          本文标题:SDAutoLayout和FDTemplateLayoutCel

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