SDAutoLayout和FDTemplateLayoutCell自动计算cell高度区别

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

SDAutoLayout和FDTemplateLayoutCell自动计算cell高度区别_第1张图片
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?

你可能感兴趣的:(SDAutoLayout和FDTemplateLayoutCell自动计算cell高度区别)