追加:iOS11和iPhoneX已適配,由于iOS11中UITableView默認(rèn)開(kāi)啟高度預(yù)估(行高、區(qū)頭和區(qū)尾),由此引起的頁(yè)面回彈等現(xiàn)象,關(guān)閉高度預(yù)估即可解決,控件內(nèi)部已做調(diào)整,無(wú)需更改代碼,替換新版代碼即可解決。 --2017/10/11
最近項(xiàng)目中需要自定義的刷新動(dòng)畫(huà),所以研究了下MJRefresh的實(shí)現(xiàn)原理,確實(shí)非常巧妙。
下面說(shuō)一下mj的實(shí)現(xiàn)原理:
首先,在UITableView或者UICollectionView的最上方和最下方各放置一個(gè)刷新的控件<mj_header和mj_footer>;
然后,實(shí)現(xiàn)對(duì)UITableView或者UICollectionView的監(jiān)聽(tīng),主要使用KVO,監(jiān)聽(tīng)三個(gè)屬性,contentOffset,contentSize和滑動(dòng)手勢(shì)的狀態(tài)改變;
最后,根據(jù)監(jiān)聽(tīng)到的變化,改變刷新控件的顯示。
剩下的就是一些細(xì)節(jié)的處理,這里有一個(gè)我寫(xiě)好的demo,感興趣的同學(xué)可以下載看一下:https://github.com/wangzhaomeng/LLRefresh
效果圖:

LLRefresh.png
覺(jué)得好,請(qǐng)給個(gè)star,謝謝!