背景:
商品詳情頁,內(nèi)容較多咧七,分多個(gè)接口請(qǐng)求加載衰齐。根據(jù)請(qǐng)求到的數(shù)據(jù)任斋,來判斷是否顯示某些內(nèi)容继阻。
處理方法
多個(gè)接口按順序請(qǐng)求,請(qǐng)求完一個(gè)废酷,在接著請(qǐng)求下一個(gè)瘟檩。將得到的數(shù)據(jù),加載進(jìn)來澈蟆,在刷新整個(gè)商品詳情的tableView墨辛。
現(xiàn)象:
iOS 11系統(tǒng)下,TableView 調(diào)用reloadData
方法趴俘,會(huì)導(dǎo)致整個(gè)界面跳動(dòng)睹簇、閃屏現(xiàn)象,拖拉到某個(gè)位置寥闪,在根據(jù)接口返回?cái)?shù)據(jù)加載刷新tableView太惠,效果更慘。疲憋。iOS 11之前系統(tǒng)不會(huì)出現(xiàn)閃屏跳動(dòng)現(xiàn)象凿渊。效果如下圖:
分析原因
既然只是在iOS 11系統(tǒng)才會(huì)出現(xiàn)這個(gè)問題,就研究下iOS 11的一個(gè)特性缚柳。
iOS 11系統(tǒng)埃脏,tableView的加載及顯示cell機(jī)制做了調(diào)整。
根本原因
產(chǎn)生的原因是在創(chuàng)建TableViewCelll的時(shí)候秋忙,系統(tǒng)給加了一個(gè)默認(rèn)預(yù)估estimatedRowHeight
的cell高度== UITableViewAutomaticDimension
彩掐。
參見系統(tǒng)屬性備注:@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable
默認(rèn)是UITableViewAutomaticDimension
,當(dāng)設(shè)置這個(gè)屬性是0的時(shí)候,就不會(huì)估算cell高度了灰追。
iOS 11以后系統(tǒng)默認(rèn)開啟Self-Sizing佩谷,Self-Sizing官方文檔解釋:大概是說我們不用再自己去計(jì)算cell的高度了,只要設(shè)置好這兩個(gè)屬性监嗜,約束好布局谐檀,系統(tǒng)會(huì)自動(dòng)計(jì)算好cell的高度。
解決辦法:
將估算高度設(shè)置為0即可:
tableView.estimatedRowHeight = 0;
如果你有使用裁奇、加載sectionHeadView或sectionFootView的需求桐猬,也會(huì)出現(xiàn)閃屏現(xiàn)象,同理將這兩個(gè)估算高度設(shè)置為0即可刽肠。
tableview.estimatedSectionHeaderHeight = 0;
tableview.estimatedSectionFooterHeight = 0;