![(logo)](https://camo.githubusercontent.com/7eb2233afa07cd2919fee4bdd5ab31e6b58022f5a0ed1606eac2b3ab60e8f9f8/687474703a2f2f696d616765732e636e6974626c6f672e636f6d2f626c6f67323031352f3439373237392f3230313530352f3035313030343439323034333338352e706e67)
- The easiest way to use pull-to-refresh
- 用法最简单的下拉刷新框架:一行代码搞定
- Getting Started
- Examples
- 期待
UIScrollView
、UITableView
、UICollectionView
、UIWebView
- cocoapods导入:
pod 'MJRefresh'
- 手动导入:
- 将
MJRefresh
文件夹中的所有文件拽入项目中
- 导入主头文件:
#import "MJRefresh.h"
Base Custom
MJRefresh.bundle MJRefresh.h
MJRefreshConst.h MJRefreshConst.m
UIScrollView+MJExtension.h UIScrollView+MJExtension.m
UIScrollView+MJRefresh.h UIScrollView+MJRefresh.m
UIView+MJExtension.h UIView+MJExtension.m
![](https://camo.githubusercontent.com/e986ad9c52c7cf5681b1a65f823e99ee9fa0123fa1201b87ef9f90444e3ad08c/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313231323336353034313635302e706e67)
* 更多App信息可以关注:[M了个J-博客园](http://www.cnblogs.com/mjios/p/4409853.html)
![](https://camo.githubusercontent.com/137c7dd4057b9dcc9b2bdea7c30440dc0cc1121f3361a71a8af86526c7022228/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3133323233323435363133393137372e706e67)
- 图中
红色文字的类
:可以直接拿来用
- 下拉刷新控件的种类
- 默认(Normal):
MJRefreshNormalHeader
- 动图(Gif):
MJRefreshGifHeader
- 上拉刷新控件的种类
- 自动刷新(Auto)
- 默认(Normal):
MJRefreshAutoNormalFooter
- 动图(Gif):
MJRefreshAutoGifFooter
- 自动回弹(Back)
- 默认(Normal):
MJRefreshBackNormalFooter
- 动图(Gif):
MJRefreshBackGifFooter
- 图中
非红色文字的类
:拿来继承,用于自定义刷新控件
- 关于如何自定义刷新控件,可以参考下图的类
![](https://camo.githubusercontent.com/86171cf529612d188f23a02650aee85378a4d89b4e6944f51cab438f48781ad5/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313335383135393130373839332e706e67)
* 由于这个框架的功能较多,就不写具体文字描述其用法
* 大家可以直接参考示例中的MJTableViewController、MJCollectionViewController、MJWebViewController,更为直观快速
![](https://camo.githubusercontent.com/97cbe1f88f0be3d1d53c70c2e12adc75905a67e2cea52eb8aa44843e63aa5dd5/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313334353437303034383132302e706e67)
self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
// 进入刷新状态后会自动调用这个block
}];
或
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 马上进入刷新状态
[self.tableView.header beginRefreshing];
![(下拉刷新01-普通)](https://camo.githubusercontent.com/8c82e227b35c2c96260960d4e04dd8d0469d1a0cdf4e444c41a9e4ba0233df2a/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230343334333438363135312e676966)
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 设置普通状态的动画图片
[header setImages:idleImages forState:MJRefreshStateIdle];
// 设置即将刷新状态的动画图片(一松开就会刷新的状态)
[header setImages:pullingImages forState:MJRefreshStatePulling];
// 设置正在刷新状态的动画图片
[header setImages:refreshingImages forState:MJRefreshStateRefreshing];
// 设置header
self.tableView.header = header;
![(下拉刷新02-动画图片)](https://camo.githubusercontent.com/bf3c68388203c48cc88a9c1a7ec8180a74f0879230e499b489465b59d9260fd5/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230343430323233383338392e676966)
// 隐藏时间
header.lastUpdatedTimeLabel.hidden = YES;
![(下拉刷新03-隐藏时间)](https://camo.githubusercontent.com/a3a8be6e3b5b15a07be9945b731efcbdbda51e51d40ff649c888bd98105f3407/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230343435363133323934342e676966)
// 隐藏时间
header.lastUpdatedTimeLabel.hidden = YES;
// 隐藏状态
header.stateLabel.hidden = YES;
![(下拉刷新04-隐藏状态和时间0)](https://camo.githubusercontent.com/515ae41267eb5db6145872ee3ff068ae3f4b1e1d0df2db4515ba7c965f45d38d/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230343530383633393533392e676966)
// 设置文字
[header setTitle:@"Pull down to refresh" forState:MJRefreshStateIdle];
[header setTitle:@"Release to refresh" forState:MJRefreshStatePulling];
[header setTitle:@"Loading ..." forState:MJRefreshStateRefreshing];
// 设置字体
header.stateLabel.font = [UIFont systemFontOfSize:15];
header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14];
// 设置颜色
header.stateLabel.textColor = [UIColor redColor];
header.lastUpdatedTimeLabel.textColor = [UIColor blueColor];
![(下拉刷新05-自定义文字)](https://camo.githubusercontent.com/dbef27b5175f3efa986ecf6c7ab564aaa41d08816ab25059a1281fda9083eb96/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230343536333633333539332e676966)
self.tableView.header = [MJDIYHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 具体实现参考MJDIYHeader.h和MJDIYHeader.m
![(下拉刷新06-自定义刷新控件)](https://camo.githubusercontent.com/a16763f44dc3abe316e2f08bd4061ba6f82233b7ff63a7c0f675ce6a7f9ac77f/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353031393236313135392e676966)
self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
// 进入刷新状态后会自动调用这个block
}];
或
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
![(上拉刷新01-默认)](https://camo.githubusercontent.com/990c74424cf8903bdd8a010c5080984b32348ce942998c05341960e71f08e700/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353039303034373639362e676966)
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
MJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 设置刷新图片
[footer setImages:refreshingImages forState:MJRefreshStateRefreshing];
// 设置尾部
self.tableView.footer = footer;
![(上拉刷新02-动画图片)](https://camo.githubusercontent.com/21d974d5d479d9a0557a97d1e019ebcd2ca86683f55b3f0d50bd88b4fa107b2e/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353134313434353739332e676966)
// 隐藏刷新状态的文字
footer.refreshingTitleHidden = YES;
// 如果没有上面的方法,就用footer.stateLabel.hidden = YES;
![(上拉刷新03-隐藏刷新状态的文字)](https://camo.githubusercontent.com/76195fef3efd67d41eb97b3ed54d40886537b64434a277d9a038b387488743ce/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353230303938353737342e676966)
// 变为没有更多数据的状态
[footer noticeNoMoreData];
![(上拉刷新04-全部加载完毕)](https://camo.githubusercontent.com/1d844ea98b7e15b5ad6afda84cef331990070c0d028439427f6d458468b522af/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353234383633343638362e676966)
// 设置文字
[footer setTitle:@"Click or drag up to refresh" forState:MJRefreshStateIdle];
[footer setTitle:@"Loading more ..." forState:MJRefreshStateRefreshing];
[footer setTitle:@"No more data" forState:MJRefreshStateNoMoreData];
// 设置字体
footer.stateLabel.font = [UIFont systemFontOfSize:17];
// 设置颜色
footer.stateLabel.textColor = [UIColor blueColor];
![(上拉刷新05-自定义文字)](https://camo.githubusercontent.com/f656b8f7257d8419d765ee3ee722fb7061fc9592b21699b29851cd0f016a7d99/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353239353531313135332e676966)
// 隐藏当前的上拉刷新控件
self.tableView.footer.hidden = YES;
![(上拉刷新06-加载后隐藏)](https://camo.githubusercontent.com/ed34741fbef2ac72f18f0506c5c9228b919b109e2350e1d0509c4e0fd8462c5b/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353334333438313832312e676966)
self.tableView.footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
![(上拉刷新07-自动回弹的上拉01)](https://camo.githubusercontent.com/148d37ccd3122e665f5209dd76ed81f3cdc6197edc027a9f8a502c8af6d6d7a1/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353339323233393233312e676966)
MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 设置普通状态的动画图片
[footer setImages:idleImages forState:MJRefreshStateIdle];
// 设置即将刷新状态的动画图片(一松开就会刷新的状态)
[footer setImages:pullingImages forState:MJRefreshStatePulling];
// 设置正在刷新状态的动画图片
[footer setImages:refreshingImages forState:MJRefreshStateRefreshing];
// 设置尾部
self.tableView.footer = footer;
![(上拉刷新07-自动回弹的上拉02)](https://camo.githubusercontent.com/376723b5ad2482367084cd3953f64ffdfc5168d5ec71e3c8acb9809595939fa6/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353434313434333632382e676966)
self.tableView.footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 具体实现参考MJDIYAutoFooter.h和MJDIYAutoFooter.m
![(上拉刷新09-自定义刷新控件(自动刷新))](https://camo.githubusercontent.com/36f43b124026cea22425094565afeedaed4478c4528bd37a62da0c62541bb25b/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353530303139353836362e676966)
self.tableView.footer = [MJDIYBackFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 具体实现参考MJDIYBackFooter.h和MJDIYBackFooter.m
![(上拉刷新10-自定义刷新控件(自动回弹))](https://camo.githubusercontent.com/cc09be90b06ec83f5b0a85ebb775dcf2fe96dfa1fbb5ea0e05c94a082b8974fd/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230353536303636363831392e676966)
// 下拉刷新
self.collectionView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
// 进入刷新状态后会自动调用这个block
}];
// 上拉刷新
self.collectionView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
// 进入刷新状态后会自动调用这个block
}];
![(UICollectionView01-上下拉刷新)](https://camo.githubusercontent.com/8acc5638eb6250fce94517e1fc8add823851dbfd2bdc02af2e3072e8c9aeaf0b/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230363032313630333735382e676966)
// 添加下拉刷新控件
self.webView.scrollView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
// 进入刷新状态后会自动调用这个block
}];
![(UICollectionView01-上下拉刷新)](https://camo.githubusercontent.com/31bdb3283331dfb1f5af708f9b3397a121a8c2f1ad31daf293650a3d7c3487fe/687474703a2f2f696d61676573302e636e626c6f67732e636f6d2f626c6f67323031352f3439373237392f3230313530362f3134313230363038303531343532342e676966)
- 本框架纯ARC,兼容的系统>=iOS6.0、iPhone\iPad横竖屏
- 如果在使用过程中遇到BUG,希望你能Issues我,谢谢(或者尝试下载最新的框架代码看看BUG修复没有)
- 如果在使用过程中发现功能不够用,希望你能Issues我,我非常想为这个框架增加更多好用的功能,谢谢
- 如果你想为MJRefresh输出代码,请拼命Pull Requests我
- 一起携手打造天朝乃至世界最好用的刷新框架,做天朝程序员的骄傲
- 如果你开发的应用中用到了MJRefresh,希望你能到CocoaControls添加你应用的iTunes路径,我将会安装使用你的应用,并且根据众多应用的使用情况,对MJRefresh进行一个更好的设计和完善,提供更多好用的功能,谢谢
- 步骤01(微信是举个例子,百度“你的应用名称 itunes”)
![(step01)](https://camo.githubusercontent.com/cadeb811e21de1413be38242a21000d9369839256420786da88247f86dc3d517/687474703a2f2f7777342e73696e61696d672e636e2f6d77313032342f3830306364663963747731657130766969763572736a3230736d3065613431742e6a7067)
- 步骤02
![(step02)](https://camo.githubusercontent.com/6e07b2758f52143b75bb0ed1e5cf2e136670107d04cf2cb48bca574721361928/687474703a2f2f7777322e73696e61696d672e636e2f6d77313032342f383030636466396374773165713076696c656a786c6a32307475306d653761302e6a7067)
- 步骤03
![(step03)](https://camo.githubusercontent.com/2ca35138bdfbb2d30a813769e604ba2d98a22946fe89083d1ac09a8d4ac9e966/687474703a2f2f7777312e73696e61696d672e636e2f6d77313032342f383030636466396374773165713076696f63706f356a3230776330646330756e2e6a7067)
- 步骤04
![(step04)](https://camo.githubusercontent.com/ff04859175cb2b8406cd13c8a9ea98ca91ee45cae322870874511ee7c445166f/687474703a2f2f7777332e73696e61696d672e636e2f6d77313032342f3830306364663963747731657130766972313337786a323073693067657767752e6a7067)