轉: 在 iOS8 引入 Self-Sizing 之後,我們可以通過實現estimatedRowHeight相關的屬性來展示動態的內容,實現了estimatedRowHeight屬性後,得到的初始contenSize是個估算值,是通過estimatedRowHeight乘以 cell的個數得到的,並不是最終的contenSize,只是當前屏幕能夠顯示的cell個數,滑動時,tableView不停地得到新的cell,更新自己的contenSize。
Self-Sizing在iOS11下是默認開啓的,Headers, footers, and cells都默認開啓Self-Sizing,所有estimated高度默認值從iOS11之前的 0改變爲UITableViewAutomaticDimension:
如果目前項目中沒有使用estimateRowHeight屬性,在
[ iOS11~ iOS12 ]
的環境下就要注意了,因爲開啓Self-Sizing之後,tableView是使用estimateRowHeight屬性的,這樣就會造成contentSize和contentOffset值的變化,如果是有動畫是觀察這兩個屬性的變化進行的,就會造成動畫的異常,因爲在估算行高機制下,contentSize的值是一點點地變化更新的,所有cell顯示完後纔是最終的contentSize值。因爲不會緩存正確的行高,tableView reloadData的時候,會重新計算contentSize,就有可能會引起contentOffset的變化。
2,解決方案:關閉默認開啓的選項
OC
self.tableView.estimatedRowHeight =0;
self.tableView.estimatedSectionHeaderHeight =0;
self.tableView.estimatedSectionFooterHeight =0;
Swift
tableView?.estimatedRowHeight = 0
tableView?.estimatedSectionHeaderHeight = 0
tableView?.estimatedSectionFooterHeight = 0