iPhone XR:828px x 1792px
iPhone XS Max: 1242px x 2688px
iPhone X 的尺寸375ptx812pt
这里有两个能够让Cell自适应的方式
对UITableView进行设置
tableView.rowHeight =UITableViewAutomaticDimension
通过代理返回
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
returnUITableViewAutomaticDimension;
}
结果是无论使用哪个方法、在每次Cell即将被展示的时候、都会自动调用上述的systemLayoutSizeFittingSize方法。
两个关键的步骤是:
通过cellForRowAtIndexPath对某个Cell进行配置
而我们在这一步已经将Cell的内容配置完毕了
通过[UITableView _heightForCell:atIndexPath:]计算Cell高度
而内部则调用systemLayoutSizeFittingSize获取具体的高度。
如何缓存?
经过以上两个探索、我们已经知道Cell通过systemLayoutSizeFittingSize高度、并且不会被缓存。
那么、我们需要做的就是自己计算高度、并且缓存。直接贴一下代码:
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
BSQuestionsModel * model = _dataArray[indexPath.section];
returnmodel.cell_height?:UITableViewAutomaticDimension;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
BSQuestionsModel * model = _dataArray[indexPath.section];
BSQuestionsTableViewCell * cell = [BSQuestionsTableViewCell cellForTableView:tableView model:model];
//高度缓存
CGFloatheight = [cell systemLayoutSizeFittingSize:CGSizeMake(tableView.frame.size.width,0) withHorizontalFittingPriority:UILayoutPriorityRequiredverticalFittingPriority:UILayoutPriorityFittingSizeLevel].height;
model.cell_height = height;
returncell;
}
这样、cell在进行过一次高度计算之后。就不需要在计算第二次了
然后关于上面的代码有几点需要说:
为什么在cellForRowAtIndexPath里做缓存
最开始我们已经谈过了、cellForRowAtIndexPath的调用在获取自动布局的高度之前、这样也能避免重复取用对应位置的Cell。
而返回的UITableViewAutomaticDimension主要是为了怕低版本有问题(虽然我感觉应该不会)。
为什么用systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority
网上很多帖子都这样写:
[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]
但是在我这不太好用、因为我cell内部有一些优先级的设置。
所以、我干脆和系统调用的方式一样。
异步计算
是的、我们又可以异步计算了。虽然我没写、因为我现在得抓紧码页面~