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