内容简介:目录前几天读文档的时候发现一对方法具体可以参阅
目录
-
系统如何计算的自适应高度?
-
系统计算的行高会不会被缓存?
-
如何缓存?
前几天读文档的时候发现一对方法
- (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自适应的方式
-
对UITableView进行设置
tableView.rowHeight = UITableViewAutomaticDimension
-
通过代理返回
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; }
结果是无论使用哪个方法、在 每次 Cell即将被展示的时候、都会自动调用上述的 systemLayoutSizeFittingSize
方法。
两个关键的步骤是:
-
通过
cellForRowAtIndexPath
对某个Cell进行配置而我们在这一步已经将Cell的内容配置完毕了
-
通过
[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在进行过一次高度计算之后。就不需要在计算第二次了
然后关于上面的代码有几点需要说:
-
为什么在
cellForRowAtIndexPath
里做缓存最开始我们已经谈过了、
cellForRowAtIndexPath
的调用在获取自动布局的高度之前、这样也能避免重复取用对应位置的Cell。
而返回的 UITableViewAutomaticDimension
主要是为了怕低版本有问题( 虽然我感觉应该不会 )。
-
为什么用
systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority
网上很多帖子都这样写:
[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]
但是在我这不太好用、因为我cell内部有一些优先级的设置。
所以、我干脆和系统调用的方式一样。
-
异步计算
是的、我们又可以异步计算了。虽然我没写、因为我现在得抓紧码页面~
关于一些旧帖子
我搜到的都是14/15年的帖子、和现在的情况感觉还是有出入的。
-
cell.contentView
取出的高度要+1网上对+1的解释是、
cell
比cell.contentView
要搞出1个单位。还附上了两张图。
但是现在、cell是比cell.contentView高出0.5( 0.5也不一定准确、xib上有四舍五入的嫌疑 )、而不是1。
-
用
cell
还是用cell.contentView
我在网上搜了很多帖子、都说要使用cell.contentView
但是我用cell一样可以获取高度。所以用cell呗~
最后
本文主要是自己的学习与总结。如果文内存在纰漏、万望留言斧正。如果愿意补充以及不吝赐教小弟会更加感激。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 伯克利提出高效在线适应算法,让机器人拥有快速适应环境变化的新能力
- 浅谈Web自适应
- 自适应布局
- <input> 宽度自适应变化
- 强化学习机器人也有很强环境适应能力,伯克利AI室验室赋能元训练+在线自适应
- 左侧固定,右侧自适应的布局方案
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!