iOS 深度好文iOS点点滴滴

iOS 11中 tableView.contentOffset的

2017-10-16  本文已影响0人  Phelthas

今天遇到了个比较奇葩的问题
一个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。。。

上一篇下一篇

猜你喜欢

热点阅读