美文网首页
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