iOS 11中 tableView.contentOffset的值在reloadData后变了

今天遇到了个比较奇葩的问题
一个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开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 9,085评论 3 38
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 4,717评论 1 9
  • { 24、Sqlite数据库 1、存储大数据量,增删改查,常见管理系统:Oracle、MSSQLServer、DB...
    CYC666阅读 959评论 0 1
  • 焦点一期洛阳刘琳坚持分享第五十四天 今天一早起来和两位老师一起约练,在练习过程当中,我们有咨询师有来访者有观...
    小溪与大海阅读 328评论 0 0
  • 在我们的生活中,我们永远离不开好奇。好奇是我们的天性。好奇,就像一张无止境的答题卡,让我们不断地去发掘、探索答案。...
    柠sir阅读 295评论 0 0