1. 使用說明
tableView.mj_header = NGAnimationRefreshHeaderView(refreshingBlock: {
????weakself?.loadData()
})
2.基本原理講解
首先我們先來看兩張圖


通過這兩張圖,我們大致的梳理下MJ的原理。MJ的Header和Footer并不是直接加在UIScrollview(及其子類,本文UITableView和UICollectionView都不再單獨(dú)提起,直接UIScrollview說明,原理是一樣的),而是加在contentInset中的,因此需要使用MJ的時候必須要保證alwaysBounceVertical為True,否則無效。
我們在使用時,直接設(shè)置Header和Footer就可以使用,因?yàn)樵O(shè)置時調(diào)用setter方法,MJ已經(jīng)在內(nèi)部通過這個方法為我們處理好了所有的流程。不得不說,這個控件封裝的的確是太厲害了。
3.流程圖說

其中WillRefresh和NoMoreData這兩個狀態(tài)沒有在流程圖中提及。
WillRefresh 是在當(dāng)前界面沒有顯示,設(shè)置的一個臨時狀態(tài)
NoMoreData 用于上拉加載更多時,沒有更多數(shù)據(jù)的時候
4.詳細(xì)分析和關(guān)鍵代碼分析
MJRefreshComponent類,所有footer和header的父類
監(jiān)聽了scrollView的contentOffset和contentInset和pan的state變化,通過這幾個變化讓MJRefreshComponent子類做出不同的變化。
當(dāng)拉下刷下時,headerView可以一直顯示是因?yàn)?,?dāng)達(dá)到刷新臨界點(diǎn)時,會通過resetInset方法讓UIScrollView下移
5.模擬拉上刷新代碼
? ? let scrollView = UIScrollView()
? ? scrollView.backgroundColor = .red
? ? self.view.addSubview(scrollView)
? ? scrollView.alwaysBounceVertical = true
? ? scrollView.contentInset = UIEdgeInsets(top: -30, left: 0, bottom: 0, right: 0)
? ? let topView = UIView(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 30))
? ? topView.backgroundColor = .cyan
? ? scrollView.addSubview(topView)
? ? scrollView.snp.makeConstraints { (make) in
? ? ? ? make.edges.equalToSuperview()
? ? }