更新
//
我也好久沒有看簡書,基本上自身的問題還是存在的很明顯,我是自學(xué),基礎(chǔ)很差,也很懶。所以對(duì)有些問題理解的不太透徹。有問題大家提出來,我可以貼上來供大家查看。
將MJRefreshAutoNormalFooter 替換成 MJRefreshBackNormalFooter,除了這個(gè)暫無其他辦法。。。來自評(píng)論的一位網(wǎng)友。(想@一下。不知掉怎么@呀。。。)
//
最近部門調(diào)整,開始學(xué)新的東西,開始學(xué)習(xí)前端,好久沒有動(dòng)過原先的oc項(xiàng)目。最近 升級(jí)Xcode 9 + iOS 11后,一直沒怎么用過了,新項(xiàng)目開發(fā)用的vue+Vux。舊項(xiàng)目需要維護(hù),調(diào)試接口的時(shí)候發(fā)現(xiàn)原本沒問題的tableView出現(xiàn)了好多異常。
使用MJRefresh
上拉加載的時(shí)候如果沒有更多數(shù)據(jù),用上次的數(shù)據(jù)刷新tableview 然后【self.tableView.mj_footer endRefreshing】后,回調(diào)將會(huì)多次調(diào)用。
1.頭部刷新UI出現(xiàn)了錯(cuò)亂
查閱發(fā)現(xiàn) iOS11棄用了automaticallyAdjustsScrollViewInsets屬性,新增contentInsetAdjustmentBehavior來替代它
UIScrollViewContentInsetAdjustmentBehavior 是一個(gè)枚舉類型,值有以下幾種:
-automatic 和scrollableAxes一樣,scrollView會(huì)自動(dòng)計(jì)算和適應(yīng)頂部和底部的內(nèi)邊距并且在scrollView 不可滾動(dòng)時(shí),也會(huì)設(shè)置內(nèi)邊距.
-scrollableAxes 自動(dòng)計(jì)算內(nèi)邊距.
-never不計(jì)算內(nèi)邊距
-always 根據(jù)safeAreaInsets 計(jì)算內(nèi)邊距
//tableView的位置 添加下面代碼
if (@available(iOS 11.0, *)) {
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
2、tableView上拉刷新出現(xiàn)回彈 區(qū)頭區(qū)尾留白 空隙變大
tableview出現(xiàn)的回彈異常
刷新絕大部分用的都是MJRefresh,去githubt瀏覽了下相關(guān)留言
總結(jié)其上拉的主要問題的原因是 tableViews :在iOS 11中默認(rèn)啟用Self-Sizing
這個(gè)應(yīng)該是UITableView最大的改變。我們知道在iOS8引入Self-Sizing 之后,我們可以通過實(shí)現(xiàn)estimatedRowHeight相關(guān)的屬性來展示動(dòng)態(tài)的內(nèi)容,實(shí)現(xiàn)了estimatedRowHeight屬性后,得到的初始contenSize是個(gè)估算值,是通過estimatedRowHeight 乘以 cell的個(gè)數(shù)得到的,并不是最終的contenSize,只是當(dāng)前屏幕能夠顯示的cell個(gè)數(shù),滑動(dòng)時(shí),tableView不停地得到新的cell,更新自己的contenSize。
Self-Sizing在iOS11下是默認(rèn)開啟的,Headers, footers, and cells都默認(rèn)開啟Self-Sizing,所有estimated 高度默認(rèn)值從iOS11之前的 0 改變?yōu)閁ITableViewAutomaticDimension:
如果目前項(xiàng)目中沒有使用estimateRowHeight屬性,在iOS11的環(huán)境下就要注意了,因?yàn)殚_啟Self-Sizing之后,tableView是使用estimateRowHeight屬性的,這樣就會(huì)造成contentSize和contentOffset值的變化,如果是有動(dòng)畫是觀察這兩個(gè)屬性的變化進(jìn)行的,就會(huì)造成動(dòng)畫的異常,因?yàn)樵诠浪阈懈邫C(jī)制下,contentSize的值是一點(diǎn)點(diǎn)地變化更新的,所有cell顯示完后才是最終的contentSize值。因?yàn)椴粫?huì)緩存正確的行高,tableView reloadData的時(shí)候,會(huì)重新計(jì)算contentSize,就有可能會(huì)引起contentOffset的變化。
iOS11下不想使用Self-Sizing的話,可以通過以下方式關(guān)閉:
//添加以下代碼
self.tableView.estimatedRowHeight =0;
self.tableView.estimatedSectionHeaderHeight =0;
self.tableView.estimatedSectionFooterHeight =0;
注意:這種問題未使用上面解決辦法而使用以下這種方法,只能解決留白問題,反而導(dǎo)致上拉刷新回彈問題
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
return nil;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
return nil;
}
總結(jié):經(jīng)測試最容易出現(xiàn)問題的是iOS11 plus機(jī)型,用出現(xiàn)問題的機(jī)型從App Store重新下載之前版本并不會(huì)出現(xiàn)問題,這些問題出現(xiàn)可能都是由于Xcode9運(yùn)行iOS11所造成的。