背景:
商品詳情頁,內容較多,分多個接口請求加載。根據請求到的數據,來判斷是否顯示某些內容。
處理方法
多個接口按順序請求,請求完一個,在接著請求下一個。將得到的數據,加載進來,在刷新整個商品詳情的tableView。
現象:
iOS 11系統下,TableView 調用reloadData
方法,會導致整個界面跳動、閃屏現象,拖拉到某個位置,在根據接口返回數據加載刷新tableView,效果更慘。。iOS 11之前系統不會出現閃屏跳動現象。效果如下圖:
分析原因
既然只是在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;