TableView刷新闪动问题 —— iOS 11

背景:

商品详情页,内容较多,分多个接口请求加载。根据请求到的数据,来判断是否显示某些内容。

处理方法

多个接口按顺序请求,请求完一个,在接着请求下一个。将得到的数据,加载进来,在刷新整个商品详情的tableView。

现象:

iOS 11系统下,TableView 调用reloadData方法,会导致整个界面跳动、闪屏现象,拖拉到某个位置,在根据接口返回数据加载刷新tableView,效果更惨。。iOS 11之前系统不会出现闪屏跳动现象。效果如下图:

iOS 11默认效果.gif

分析原因

既然只是在iOS 11系统才会出现这个问题,就研究下iOS 11的一个特性。
iOS 11系统,tableView的加载及显示cell机制做了调整。

根本原因

产生的原因是在创建TableViewCelll的时候,系统给加了一个默认预估estimatedRowHeight的cell高度== UITableViewAutomaticDimension
参见系统属性备注:@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable
默认是UITableViewAutomaticDimension,当设置这个属性是0的时候,就不会估算cell高度了。

iOS 11以后系统默认开启Self-Sizing,Self-Sizing官方文档解释:大概是说我们不用再自己去计算cell的高度了,只要设置好这两个属性,约束好布局,系统会自动计算好cell的高度。

解决办法:

将估算高度设置为0即可:

tableView.estimatedRowHeight = 0;

如果你有使用、加载sectionHeadView或sectionFootView的需求,也会出现闪屏现象,同理将这两个估算高度设置为0即可。

tableview.estimatedSectionHeaderHeight = 0;
tableview.estimatedSectionFooterHeight = 0;
修复之后的效果图:
iOS 11 修复之后的效果.gif
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容