引言
问题背景:
Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension。
estimatedRowHeight这个属性是给tableView每行设置预估行高,开启Self-Sizing之后,tableView是使用estimateRowHeight属性的,这样就会造成contentSize和contentOffset值的变化,在估算行高机制下,contentSize的值是一点点地变化更新的,所有cell显示完后才是最终的contentSize值。
因为不会缓存正确的行高,tableView reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化。
I 解决TableVIew刷新数据带来的界面跳动问题
1.1 解决方案1
解决方式1:
如果目前项目中没有使用estimateRowHeight属性,在iOS11的环境下可以关闭Self-Sizing,
if #available(iOS 11.0, *){ table_View.estimatedRowHeight = 0 table_View.estimatedSectionFooterHeight = 0 table_View.estimatedSectionHeaderHeight = 0 }
但是estimatedRowHeight设置为0 , 自动布局就失效了。因此如果你使用了自动布局 , 还要保留动画,推荐你使用方式二的局部刷新思路。
1.2 解决方案2
解决方式2:使用scrollToRowAtIndexPath来解决更新reloadData的带来的界面跳动
更新公告分组数据时就可以使用以下方式来解决
[self.viewModel.reloadSubject4Note subscribeNext:^(id _Nullable x) { if(self.viewModel.isShow_msg){ [weakSelf.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:QCTStoreViewSection4msg] atScrollPosition:UITableViewScrollPositionTop animated:YES]; }else{ [weakSelf.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:QCTStoreViewSection4Banner] atScrollPosition:UITableViewScrollPositionTop animated:YES]; // : } [weakSelf.tableView reloadData]; }];