TableView刷新閃動問題 —— iOS 11

背景:

商品詳情頁,內容較多,分多個接口請求加載。根據請求到的數據,來判斷是否顯示某些內容。

處理方法

多個接口按順序請求,請求完一個,在接著請求下一個。將得到的數據,加載進來,在刷新整個商品詳情的tableView。

現象:

iOS 11系統下,TableView 調用reloadData方法,會導致整個界面跳動、閃屏現象,拖拉到某個位置,在根據接口返回數據加載刷新tableView,效果更慘。。iOS 11之前系統不會出現閃屏跳動現象。效果如下圖:

iOS 11默認效果.gif

分析原因

既然只是在iOS 11系統才會出現這個問題,就研究下iOS 11的一個特性。
iOS 11系統,tableView的加載及顯示cell機制做了調整。

根本原因

產生的原因是在創建TableViewCelll的時候,系統給加了一個默認預估estimatedRowHeight的cell高度== UITableViewAutomaticDimension
參見系統屬性備注:@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable
默認是UITableViewAutomaticDimension,當設置這個屬性是0的時候,就不會估算cell高度了。

iOS 11以后系統默認開啟Self-Sizing,Self-Sizing官方文檔解釋:大概是說我們不用再自己去計算cell的高度了,只要設置好這兩個屬性,約束好布局,系統會自動計算好cell的高度。

解決辦法:

將估算高度設置為0即可:

tableView.estimatedRowHeight = 0;

如果你有使用、加載sectionHeadView或sectionFootView的需求,也會出現閃屏現象,同理將這兩個估算高度設置為0即可。

tableview.estimatedSectionHeaderHeight = 0;
tableview.estimatedSectionFooterHeight = 0;
修復之后的效果圖:
iOS 11 修復之后的效果.gif
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容