今天遇到了個比較奇葩的問題
一個tableView, 在數(shù)據(jù)源添加一條數(shù)據(jù)后reloadData,tableView的contentOffset值變了,
這就導致顯示的cell的位置的錯亂或者偏移;
比如數(shù)據(jù)是【1,2,3,4,5,6,7,8】,當前顯示的是【6,7,8】
這時候在數(shù)據(jù)源最后新加了一個9,
本來想要的結(jié)果是,當前還是顯示【6,7,8】,向下滑動后顯示【7,8,9】,
但出來的結(jié)果卻是【5,6,7】。。。
經(jīng)過打斷點測試,發(fā)現(xiàn)就是reloadData前后contentOffset值變化了,而且變化的還沒什么規(guī)律,
然后跟iOS 10及以下的系統(tǒng)對比,發(fā)現(xiàn)只有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來實現(xiàn)滑動到tableView底部的方法也行不通了,只能用
open func scrollToRow(at indexPath: IndexPath, at scrollPosition: UITableViewScrollPosition, animated: Bool)
注意判斷section和row沒有越界或者為負數(shù),否則會crash。。。