今天發(fā)現(xiàn)MJRefresh上拉刷新tableview偏移量會發(fā)生改變,一般沒什么問題壳猜。勾徽。。但是因為我加了一個背景漸變色统扳,而且漸變色要根據(jù)偏移量進行改變喘帚。。咒钟。然后就出現(xiàn)問題了吹由。。會發(fā)生上拉刷新閃一下背景漸變色的情況朱嘴。倾鲫。。萍嬉。
于是懷疑是UITableView的問題级乍,查看了一些博客發(fā)現(xiàn)iOS11中UITableView有很大的改動
這個應該是UITableView最大的改變。我們知道在iOS8引入Self-Sizing之后帚湘,我們可以通過實現(xiàn)estimatedRowHeight相關(guān)的屬性來展示動態(tài)的內(nèi)容玫荣,實現(xiàn)了estimatedRowHeight屬性后,得到的初始contenSize是個估算值大诸,是通過estimatedRowHeight乘以cell的個數(shù)得到的捅厂,并不是最終的contenSize,只是當前屏幕能夠顯示的cell個數(shù)资柔,滑動時焙贷,tableView不停地得到新的cell,更新自己的contenSize贿堰。
Self-Sizing在iOS11下是默認開啟的辙芍,Headers,footers,and cells都默認開啟Self-Sizing,所有estimated高度默認值從iOS11之前的0改變?yōu)閁ITableViewAutomaticDimension:
如果目前項目中沒有使用estimateRowHeight屬性羹与,在iOS11的環(huán)境下就要注意了故硅,因為開啟Self-Sizing之后,tableView是使用estimateRowHeight屬性的纵搁,這樣就會造成contentSize和contentOffset值的變化吃衅,如果是有動畫是觀察這兩個屬性的變化進行的,就會造成動畫的異常腾誉,因為在估算行高機制下徘层,contentSize的值是一點點地變化更新的峻呕,所有cell顯示完后才是最終的contentSize值。因為不會緩存正確的行高趣效,tableView reloadData的時候瘦癌,會重新計算contentSize,就有可能會引起contentOffset的變化跷敬。
最后使用方法如下進行解決
if (@available(iOS 11.0, *)) {
_tableView.estimatedRowHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;
_tableView.estimatedSectionHeaderHeight=0 ;
}
附上效果圖片: