美文网首页iOS 深度好文iOS点点滴滴
iOS 11中 tableView.contentOffset的

iOS 11中 tableView.contentOffset的

作者: Phelthas | 来源:发表于2017-10-16 16:30 被阅读0次

    今天遇到了个比较奇葩的问题
    一个tableView, 在数据源添加一条数据后reloadData,tableView的contentOffset值变了,
    这就导致显示的cell的位置的错乱或者偏移;
    比如数据是【1,2,3,4,5,6,7,8】,当前显示的是【6,7,8】
    这时候在数据源最后新加了一个9,
    本来想要的结果是,当前还是显示【6,7,8】,向下滑动后显示【7,8,9】,
    但出来的结果却是【5,6,7】。。。

    经过打断点测试,发现就是reloadData前后contentOffset值变化了,而且变化的还没什么规律,
    然后跟iOS 10及以下的系统对比,发现只有iOS 11上会这样
    所以基本可以确定是iOS 11的问题了

    然后去看iOS 11有什么新变化,
    原来iOS 11中,tableView默认启用Self-Sizing

        @available(iOS 7.0, *)
        open var estimatedRowHeight: CGFloat // default is UITableViewAutomaticDimension, set to 0 to disable
    
        @available(iOS 7.0, *)
        open var estimatedSectionHeaderHeight: CGFloat // default is UITableViewAutomaticDimension, set to 0 to disable
    
        @available(iOS 7.0, *)
        open var estimatedSectionFooterHeight: CGFloat // default is UITableViewAutomaticDimension, set to 0 to disable
    

    所以,tableView的contentSize大小一开始也是不准确的,会随着滑动逐渐变化

    知道了原因,就好解决了,只需要关闭这个功能就可以了

    解决方案:

      tableView.estimatedRowHeight = 0
      tableView.estimatedSectionHeaderHeight = 0
      tableView.estimatedSectionFooterHeight = 0
    

    注意三个属性都需要设置,即使你没用到sectionHeader或者sectionFooter也要设置!!!
    注意三个属性都需要设置,即使你没用到sectionHeader或者sectionFooter也要设置!!!
    注意三个属性都需要设置,即使你没用到sectionHeader或者sectionFooter也要设置!!!

    另外:

    因为同样的原因:用scrollRectToVisible来实现滑动到tableView底部的方法也行不通了,只能用
    open func scrollToRow(at indexPath: IndexPath, at scrollPosition: UITableViewScrollPosition, animated: Bool)
    注意判断section和row没有越界或者为负数,否则会crash。。。

    相关文章

      网友评论

        本文标题:iOS 11中 tableView.contentOffset的

        本文链接:https://www.haomeiwen.com/subject/tdnkuxtx.html