iOS-谈一谈自适应Cell的高度缓存

栏目: IOS · 发布时间: 6年前

内容简介:目录前几天读文档的时候发现一对方法具体可以参阅

目录

  • 系统如何计算的自适应高度?

  • 系统计算的行高会不会被缓存?

  • 如何缓存?

前几天读文档的时候发现一对方法

- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize NS_AVAILABLE_IOS(6_0); 
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority NS_AVAILABLE_IOS(8_0);

具体可以参阅 《iOS文档补完计划--UIView》 中的相关解释。

简而言之这两个方法会:

返回Auto Layout后内容高度

并且、我们都知道 UITableView 、如果设置成 rowHeight = UITableViewAutomaticDimension 的话。cell的高度将由系统通过 Auto Layout 自动计算。

  • 系统如何计算的自适应高度?

而这个计算、是否通过上面两个方法呢?

经过试验、答案是肯定的。

系统调用的正是 - (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority NS_AVAILABLE_IOS(8_0); 这个方法。

  • 系统计算的行高会不会被缓存?

经过试验、答案是否定的。也就是系统不会缓存计算过的行高

这里有两个能够让Cell自适应的方式

  1. 对UITableView进行设置

tableView.rowHeight = UITableViewAutomaticDimension
  1. 通过代理返回

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

结果是无论使用哪个方法、在 每次 Cell即将被展示的时候、都会自动调用上述的 systemLayoutSizeFittingSize 方法。

两个关键的步骤是:

  1. 通过 cellForRowAtIndexPath 对某个Cell进行配置

    而我们在这一步已经将Cell的内容配置完毕了

  2. 通过 [UITableView _heightForCell:atIndexPath:] 计算Cell高度

    而内部则调用 systemLayoutSizeFittingSize 获取具体的高度。

  • 如何缓存?

经过以上两个探索、我们已经知道Cell通过 systemLayoutSizeFittingSize 高度、并且不会被缓存。

那么、我们需要做的就是自己计算高度、并且缓存。直接贴一下代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    BSQuestionsModel * model = _dataArray[indexPath.section];
    return model.cell_height?:UITableViewAutomaticDimension;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    BSQuestionsModel * model = _dataArray[indexPath.section];
    BSQuestionsTableViewCell * cell = [BSQuestionsTableViewCell cellForTableView:tableView model:model];

    //高度缓存
    CGFloat height = [cell systemLayoutSizeFittingSize:CGSizeMake(tableView.frame.size.width, 0) withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel].height;
    model.cell_height = height;

    return cell;
}

这样、cell在进行过一次高度计算之后。就不需要在计算第二次了

然后关于上面的代码有几点需要说:

  1. 为什么在 cellForRowAtIndexPath 里做缓存

    最开始我们已经谈过了、 cellForRowAtIndexPath 的调用在获取自动布局的高度之前、这样也能避免重复取用对应位置的Cell。

而返回的 UITableViewAutomaticDimension 主要是为了怕低版本有问题( 虽然我感觉应该不会 )。

  1. 为什么用 systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority
    网上很多帖子都这样写:

[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]

但是在我这不太好用、因为我cell内部有一些优先级的设置。

所以、我干脆和系统调用的方式一样。

  1. 异步计算

    是的、我们又可以异步计算了。虽然我没写、因为我现在得抓紧码页面~

关于一些旧帖子

我搜到的都是14/15年的帖子、和现在的情况感觉还是有出入的。

  1. cell.contentView 取出的高度要+1

    网上对+1的解释是、 cellcell.contentView 要搞出1个单位。还附上了两张图。

iOS-谈一谈自适应Cell的高度缓存
iOS-谈一谈自适应Cell的高度缓存

但是现在、cell是比cell.contentView高出0.5( 0.5也不一定准确、xib上有四舍五入的嫌疑 )、而不是1。

  1. cell 还是用 cell.contentView

    我在网上搜了很多帖子、都说要使用cell.contentView

    但是我用cell一样可以获取高度。所以用cell呗~

最后

本文主要是自己的学习与总结。如果文内存在纰漏、万望留言斧正。如果愿意补充以及不吝赐教小弟会更加感激。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTML Dog

HTML Dog

Patrick Griffiths / New Riders Press / 2006-11-22 / USD 49.99

For readers who want to design Web pages that load quickly, are easy to update, accessible to all, work on all browsers and can be quickly adapted to different media, this comprehensive guide represen......一起来看看 《HTML Dog》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具