1. 使用说明
tableView.mj_header = NGAnimationRefreshHeaderView(refreshingBlock: {
weakself?.loadData()
})
2.基本原理讲解
首先我们先来看两张图
![](https://img.haomeiwen.com/i2251569/5d655ee3fb616401.png)
![](https://img.haomeiwen.com/i2251569/5b8b83e93dc23dd0.png)
通过这两张图,我们大致的梳理下MJ的原理。MJ的Header和Footer并不是直接加在UIScrollview(及其子类,本文UITableView和UICollectionView都不再单独提起,直接UIScrollview说明,原理是一样的),而是加在contentInset中的,因此需要使用MJ的时候必须要保证alwaysBounceVertical为True,否则无效。
我们在使用时,直接设置Header和Footer就可以使用,因为设置时调用setter方法,MJ已经在内部通过这个方法为我们处理好了所有的流程。不得不说,这个控件封装的的确是太厉害了。
3.流程图说
![](https://img.haomeiwen.com/i2251569/984209ab7db19636.png)
其中WillRefresh和NoMoreData这两个状态没有在流程图中提及。
WillRefresh 是在当前界面没有显示,设置的一个临时状态
NoMoreData 用于上拉加载更多时,没有更多数据的时候
4.详细分析和关键代码分析
MJRefreshComponent类,所有footer和header的父类
监听了scrollView的contentOffset和contentInset和pan的state变化,通过这几个变化让MJRefreshComponent子类做出不同的变化。
当拉下刷下时,headerView可以一直显示是因为,当达到刷新临界点时,会通过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()
}
网友评论