本文对应的MJRefresh版本是3.1.12
使用
MJRefresh的使用很简单,引入MJRefresh.h头文件,然后创建header或者footer赋值给tableView或者collectionView的mj_header或者mj_footer属性。设置好block或者target-action的回调就可以了。
接口也非常简单,如果没有特殊要求,提供的默认的样式已经很好了。同时MJRefresh内置的几个header和footer可以定制不同的样式,如果还不能满足需求,还可以自己写header和footer。
作者GitHub上的示例代码:
// 下拉刷新
tableView.mj_header= [MJRefreshNormalHeader headerWithRefreshingBlock:^{
// 模拟延迟加载数据,因此2秒后才调用(真实开发中,可以移除这段gcd代码)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 结束刷新
[tableView.mj_header endRefreshing];
});
}];
// 上拉刷新
tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
// 模拟延迟加载数据,因此2秒后才调用(真实开发中,可以移除这段gcd代码)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 结束刷新
[tableView.mj_footer endRefreshing];
});
}];
原理
- 通过OC的runtime,在Category中给UIScrollView增加属性,mj_header和mj_footer。
- mj_header和mj_footer使用KVO观察UIScrollView的contentOffset属性,根据属性的值判断上拉和下拉的状态。
- mj_header和mj_footer的子类负责具体的显示样式和对上拉下拉状态的响应。
源码阅读
主要类图:
从引入的头文件开始,MJRefresh.h中又包含了好几个头文件,用途分为3种类型:
第一种是辅助类型的文件:
#import "UIScrollView+MJExtension.h"
#import "UIView+MJExtension.h”
MJExtension的分类都是View上的辅助方法,为了写代码好看用的。比如UIScrollView(MJExtension)中的mj_offsetX属性,getter和setter方法是这样的:
- (CGFloat)mj_offsetX{
return self.contentOffset.x;
}
- (void)setMj_offsetY:(CGFloat)mj_offsetY{
CGPoint offset = self.contentOffset;
offset.y = mj_offsetY;
self.contentOffset = offset;
}
所以这部分代码可以略过不看。
第二种是MJRefresh提供的header和footer
#import "MJRefreshNormalHeader.h"
#import "MJRefreshGifHeader.h"
#import "MJRefreshBackNormalFooter.h"
...
第三种是UIScrollView的MJRefresh分类。
#import "UIScrollView+MJRefresh.h”
这个是阅读代码的入口。