iOS小技能:解决TableVIew刷新数据带来的界面跳动问题

引言

问题背景:

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的带来的界面跳动

更新公告分组数据时就可以使用以下方式来解决

iOS小技能:解决TableVIew刷新数据带来的界面跳动问题

 [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];

        

        
        
    }];

see also


上一篇:【技术贴】全盘文件夹快捷方式 杀毒后快捷方式消失,但文件夹打不开。重装系统后还是快捷方式的解决办法。


下一篇:AppStore 上架小技能