iOS使用MJRefresh上拉加載 多次調(diào)用的問題

更新
//
我也好久沒有看簡書,基本上自身的問題還是存在的很明顯,我是自學(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所造成的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容