本文主要是介绍iOS MJRefresh的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Contents
- 常见API
-
- MJRefreshComponent.h
- MJRefreshHeader.h
- MJRefreshFooter.h
- MJRefreshAutoFooter.h
- Examples
- Reference【参考】
- 下拉刷新01-默认
- 下拉刷新02-动画图片
- 下拉刷新03-隐藏时间
- 下拉刷新04-隐藏状态和时间
- 下拉刷新05-自定义文字
- 下拉刷新06-自定义刷新控件
- 上拉刷新01-默认
- 上拉刷新02-动画图片
- 上拉刷新03-隐藏刷新状态的文字
- 上拉刷新04-全部加载完毕
- 上拉刷新05-自定义文字
- 上拉刷新06-加载后隐藏
- 上拉刷新07-自动回弹的上拉01
- 上拉刷新08-自动回弹的上拉02
- 上拉刷新09-自定义刷新控件(自动刷新)
- 上拉刷新10-自定义刷新控件(自动回弹)
- UICollectionView01-上下拉刷新
- UIWebView01-下拉刷新
支持哪些控件的刷新
UIScrollView
、UITableView
、UICollectionView
、UIWebView
如何使用MJRefresh
- 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
MJRefresh类结构图
- 图中
红色文字的类
:可以直接拿来用- 下拉刷新控件的种类
- 默认(Normal):
MJRefreshNormalHeader
- 动图(Gif):
MJRefreshGifHeader
- 默认(Normal):
- 上拉刷新控件的种类
- 自动刷新(Auto)
- 默认(Normal):
MJRefreshAutoNormalFooter
- 动图(Gif):
MJRefreshAutoGifFooter
- 默认(Normal):
- 自动回弹(Back)
- 默认(Normal):
MJRefreshBackNormalFooter
- 动图(Gif):
MJRefreshBackGifFooter
- 默认(Normal):
- 自动刷新(Auto)
- 下拉刷新控件的种类
- 图中
非红色文字的类
:拿来继承,用于自定义刷新控件 - 关于如何自定义刷新控件,可以参考下图的类
MJRefreshComponent.h
/** 刷新控件的基类 */
@interface MJRefreshComponent : UIView
#pragma mark - 刷新状态控制
/** 进入刷新状态 */
- (void)beginRefreshing;
/** 结束刷新状态 */
- (void)endRefreshing;
/** 是否正在刷新 */
- (BOOL)isRefreshing;#pragma mark - 其他
/** 根据拖拽比例自动切换透明度 */
@property (assign, nonatomic, getter=isAutomaticallyChangeAlpha) BOOL automaticallyChangeAlpha;
@end
MJRefreshHeader.h
@interface MJRefreshHeader : MJRefreshComponent
/** 创建header */
+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 创建header */
+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;/** 这个key用来存储上一次下拉刷新成功的时间 */
@property (copy, nonatomic) NSString *lastUpdatedTimeKey;
/** 上一次下拉刷新成功的时间 */
@property (strong, nonatomic, readonly) NSDate *lastUpdatedTime;/** 忽略多少scrollView的contentInset的top */
@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop;
@end
MJRefreshFooter.h
@interface MJRefreshFooter : MJRefreshComponent
/** 创建footer */
+ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 创建footer */
+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;/** 提示没有更多的数据 */
- (void)endRefreshingWithNoMoreData;
/** 重置没有更多的数据(消除没有更多数据的状态) */
- (void)resetNoMoreData;/** 忽略多少scrollView的contentInset的bottom */
@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetBottom;/** 自动根据有无数据来显示和隐藏(有数据就显示,没有数据隐藏) */
@property (assign, nonatomic) BOOL automaticallyHidden;
@end
MJRefreshAutoFooter.h
@interface MJRefreshAutoFooter : MJRefreshFooter
/** 是否自动刷新(默认为YES) */
@property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh;/** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */
@property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent;
@end
参考
* 由于这个框架的功能较多,就不写具体文字描述其用法
* 大家可以直接参考示例中的MJTableViewController、MJCollectionViewController、MJWebViewController,更为直观快速
下拉刷新01-默认
self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{// 进入刷新状态后会自动调用这个block
}];
或
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];// 马上进入刷新状态
[self.tableView.header beginRefreshing];
下拉刷新02-动画图片
// 设置回调(一旦进入刷新状态,就调用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.mj_header = header;
下拉刷新03-隐藏时间
// 隐藏时间
header.lastUpdatedTimeLabel.hidden = YES;
下拉刷新04-隐藏状态和时间
// 隐藏时间
header.lastUpdatedTimeLabel.hidden = YES;// 隐藏状态
header.stateLabel.hidden = YES;
下拉刷新05-自定义文字
// 设置文字
[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];
//==============上面几个(1-5)举例的集合
#import "ViewController.h"
#import "MJRefresh.h"
@
interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,strong)UITableView *tab;
@end
static NSString *identifier=@"cell";
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UITableView *tab=[[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
self.tab=tab;
[self.view addSubview:tab];
tab.delegate=self;
tab.dataSource=self;
[tab registerClass:[UITableViewCell class] forCellReuseIdentifier:identifier];
UIView *hv=[[UIView alloc]initWithFrame:CGRectMake(0,20, 375,50)];
hv.backgroundColor=[UIColor redColor];
tab.tableHeaderView=hv;
//=================默认下拉刷新一
// tab.mj_header=[MJRefreshNormalHeader headerWithRefreshingBlock:^{
//
// }];
//===================默认下拉刷新二
// tab.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
//==================带各个状态时的图片
MJRefreshGifHeader *header = [MJRefreshGifHeaderheaderWithRefreshingTarget:selfrefreshingAction:@selector(loadNewData)];
/** 刷新控件的状态 */
// typedef NS_ENUM(NSInteger, MJRefreshState) {
// /** 普通闲置状态 */
// MJRefreshStateIdle = 1,
// /** 松开就可以进行刷新的状态 */
// MJRefreshStatePulling,
// /** 正在刷新中的状态 */
// MJRefreshStateRefreshing,
// /** 即将刷新的状态 */
// MJRefreshStateWillRefresh,
// /** 所有数据加载完毕,没有更多的数据了 */
// MJRefreshStateNoMoreData
// };
// header.lastUpdatedTimeLabel.text=@"更新时间";
//设置更新时间那一排文字
// NSString *lasttime=(NSString *)header.lastUpdatedTime;//这个可以获取上次刷新的时间,
header.lastUpdatedTimeText=^(NSDate *lastUpdatedTime){
//在这个block里面可以直接获取lastUpdatedTime,
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
// 设置日期格式
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
// 获取当前日期
NSString * lasttime= [formatterstringFromDate:lastUpdatedTime];
return [NSStringstringWithFormat:@"更新时间:%@",lasttime];
};
// header.stateLabel.hidden = YES;//所用文字都隐藏
// header.lastUpdatedTimeLabel.hidden = YES;//隐藏最后刷新的时间
// header.labelLeftInset=-120;//调整图片显示的位置
//设置字体大小
header.stateLabel.font = [UIFontsystemFontOfSize:15];
header.lastUpdatedTimeLabel.font = [UIFontsystemFontOfSize:14];
// 设置文字颜色
header.stateLabel.textColor = [UIColorredColor];
header.lastUpdatedTimeLabel.textColor = [UIColorblueColor];
header.ignoredScrollViewContentInsetTop=-10.0;//调整刷新控件整体下边距离内容区上边的距离
/**设置各个状态下刷新显示的文字*/
[header setTitle:@"普通状态"forState:MJRefreshStateIdle];
[header setTitle:@"送开就可以刷新"forState:MJRefreshStatePulling];
[header setTitle:@"正在刷新" forState:MJRefreshStateRefreshing];
NSArray *idleImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"80"],
[UIImage imageNamed:@"bf"],
[UIImage imageNamed:@"aer"],nil];
/**设置各个状态下刷新显示的图片*///如果设置成多张图片的数组,就显示动画
[header setImages:@[[UIImage imageNamed:@"80"]] forState:MJRefreshStateIdle];/**普通闲置状态 */
[header setImages:@[[UIImage imageNamed:@"bf"]] forState:MJRefreshStatePulling];/**松开就可以进行刷新的状态 */
[header setImages:idleImages forState:MJRefreshStateRefreshing];/**正在刷新中的状态 */
self.tab.mj_header = header;
//=========================
}
-(void)loadNewData{
[self.tab.mj_header endRefreshing];//停止下拉刷新
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return10;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
cell.textLabel.text=[NSString stringWithFormat:@"%tu",indexPath.row];
return cell;
}
@end
//=======================
下拉刷新06-自定义刷新控件
self.tableView.mj_header = [MJDIYHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 具体实现参考MJDIYHeader.h和MJDIYHeader.m
//==========================自定义下拉刷新(6)
在tableview界面实例化:
MJDIYHeader *header=[MJDIYHeader headerWithRefreshingBlock:^{
}];
self.tab.mj_header=header;
#import "MJDIYHeader.h"
@interface MJDIYHeader()
@property (weak,nonatomic) UILabel *label;
@property (weak,nonatomic) UISwitch *s;
@property (weak,nonatomic) UIImageView *logo;
@property (weak,nonatomic) UIActivityIndicatorView *loading;
@end
@implementation MJDIYHeader
#pragma mark - 重写方法
#pragma mark 在这里做一些初始化配置(比如添加子控件)
- (void)prepare
{
[superprepare];
// 设置控件的高度
self.mj_h =50;
// 添加label
UILabel *label = [[UILabelalloc] init];
label.textColor = [UIColorcolorWithRed:1.0green:0.5blue:0.0alpha:1.0];
label.font = [UIFontboldSystemFontOfSize:16];
label.textAlignment =NSTextAlignmentCenter;
[selfaddSubview:label];
self.label = label;
// 打酱油的开关
UISwitch *s = [[UISwitchalloc] init];
[selfaddSubview:s];
self.s = s;
// logo
UIImageView *logo = [[UIImageViewalloc] initWithImage:[UIImageimageNamed:@"aer"]];
logo.contentMode =UIViewContentModeScaleAspectFit;
[selfaddSubview:logo];
self.logo = logo;
// loading
UIActivityIndicatorView *loading = [[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[selfaddSubview:loading];
self.loading = loading;
}
#pragma mark 在这里设置子控件的位置和尺寸
- (void)placeSubviews
{
[superplaceSubviews];
self.label.frame =self.bounds;
self.logo.bounds =CGRectMake(0,0, self.bounds.size.width,100);
self.logo.center =CGPointMake(self.mj_w *0.5, - self.logo.mj_h +20);
self.loading.center =CGPointMake(self.mj_w -30, self.mj_h *0.5);
}
#pragma mark 监听scrollView的contentOffset改变
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
{
[superscrollViewContentOffsetDidChange:change];
}
#pragma mark 监听scrollView的contentSize改变
- (void)scrollViewContentSizeDidChange:(NSDictionary *)change
{
[superscrollViewContentSizeDidChange:change];
}
#pragma mark 监听scrollView的拖拽状态改变
- (void)scrollViewPanStateDidChange:(NSDictionary *)change
{
[superscrollViewPanStateDidChange:change];
}
#pragma mark 监听控件的刷新状态,设置状态文字
- (void)setState:(MJRefreshState)state
{
MJRefreshCheckState;
switch (state) {
caseMJRefreshStateIdle:
[self.loadingstopAnimating];
[self.ssetOn:NOanimated:YES];
self.label.text =@"赶紧下拉吖(开关是打酱油滴1)";
break;
caseMJRefreshStatePulling:
[self.loadingstopAnimating];
[self.ssetOn:YESanimated:YES];
self.label.text = @"赶紧放开我吧(开关是打酱油滴2)";
break;
caseMJRefreshStateRefreshing:
[self.ssetOn:YESanimated:YES];
self.label.text =@"加载数据中(开关是打酱油滴3)";
[self.loadingstartAnimating];
break;
default:
break;
}
}
#pragma mark 监听拖拽比例(控件被拖出来的比例)
- (void)setPullingPercent:(CGFloat)pullingPercent
{
[supersetPullingPercent:pullingPercent];
// 1.0 0.5 0.0
// 0.5 0.0 0.5
CGFloat red =1.0 - pullingPercent * 0.5;
CGFloat green =0.5 - 0.5 * pullingPercent;
CGFloat blue =0.5 * pullingPercent;
self.label.textColor = [UIColorcolorWithRed:red green:green blue:bluealpha:1.0];
}
@end
//========================
上拉刷新01-默认
self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{// 进入刷新状态后会自动调用这个block
}];
或
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
上拉刷新02-动画图片
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
MJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];// 设置刷新图片
[footer setImages:refreshingImages forState:MJRefreshStateRefreshing];// 设置尾部
self.tableView.mj_footer = footer;
上拉刷新03-隐藏刷新状态的文字
// 隐藏刷新状态的文字
footer.refreshingTitleHidden = YES;
// 如果没有上面的方法,就用footer.stateLabel.hidden = YES;
上拉刷新04-全部加载完毕
// 变为没有更多数据的状态
[footer endRefreshingWithNoMoreData];
上拉刷新05-自定义文字
// 设置文字
[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];
上拉刷新06-加载后隐藏
// 隐藏当前的上拉刷新控件
self.tableView.mj_footer.hidden = YES;
//******************************************************
// //=====================默认auto上拉刷新一
self.tab.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
[ self.tab.mj_footer endRefreshing];
}];
// // ============默认auto上拉刷新二
// self.tab.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
//
// //==================auto上拉刷新带图片
// MJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
//
//
//设置状态label的文字大小和文字颜色
footer.stateLabel.font = [UIFont systemFontOfSize:17];
footer.stateLabel.textColor = [UIColor redColor];
[footer resetNoMoreData];//取消没有更多数据的状态,改成了普通状态
[footer endRefreshingWithNoMoreData];//没有更多数据时提示;如果没有调用这个方法,没有更多数据时就不显示提示文字
footer.automaticallyHidden=NO;/** 自动根据有无数据来显示和隐藏(有数据就显示,没有数据隐藏。默认是NO) */
footer.ignoredScrollViewContentInsetBottom=-50;//调整底部上拉刷新和内容之间的距离
//
// // footer.automaticallyRefresh=NO;//是否自动刷新,默认yes
// // footer.triggerAutomaticallyRefreshPercent=0.6;//1.0表示底部控件完全出现时自动刷新,默认1.0
footer.refreshingTitleHidden=YES;//上拉刷新的文字是否隐藏,下面的方法也可以
footer.stateLabel.hidden=YES;//隐藏上拉刷新的label,文字就不显示了
footer.labelLeftInset=-50;//调整图片与文字之间的距离
// /**设置各个状态auto上拉刷新显示的文字*/
// [footer setTitle:@"点击或上拉刷新" forState:MJRefreshStateIdle];
//
// [footer setTitle:@"正在刷新....." forState:MJRefreshStateRefreshing];
//
// [footer setTitle:@"没有更多数据了" forState:MJRefreshStateNoMoreData];
//
// //,设置各个状态auto上拉刷显示的图片动画;如果是多张图片的数组就是动画,
// NSArray *refreshingImages = [NSArray arrayWithObjects:
// [UIImage imageNamed:@"80"],
// [UIImage imageNamed:@"bf"],
// [UIImage imageNamed:@"aer"],nil];
// [footer setImages:refreshingImages forState:MJRefreshStateRefreshing];
//
// self.tab.mj_footer = footer;
footer.hidden=YES;//隐藏刷新控件
上拉刷新07-自动回弹的上拉01
self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
上拉刷新08-自动回弹的上拉02
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.mj_footer = footer;
//**********************************
// //==================backfooter会弹回底部的上拉刷新控件
// //普通状态
self.tab.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
带动画的
// MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
//
//
// //设置动画
// NSArray *refreshingImages = [NSArray arrayWithObjects:
// [UIImage imageNamed:@"80"],
// [UIImage imageNamed:@"bf"],
// [UIImage imageNamed:@"aer"],nil];
//
[footer setImages:idleImages forState:MJRefreshStateIdle];
[footer setImages:pullingImages forState:MJRefreshStatePulling];
//
// [footer setImages:refreshingImages forState:MJRefreshStateRefreshing];
//
其他的设置跟自动上拉刷新一样
// self.tab.mj_footer = footer;
上拉刷新09-自定义刷新控件(自动刷新)
self.tableView.mj_footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 具体实现参考MJDIYAutoFooter.h和MJDIYAutoFooter.m
//*****************
//========================auto自定义上拉刷新
// //引入#import "MJDIYAutoFooter.h" 里面的代码根据需求修改
//
// self.tab.mj_footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
上拉刷新10-自定义刷新控件(自动回弹)
self.tableView.mj_footer = [MJDIYBackFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 具体实现参考MJDIYBackFooter.h和MJDIYBackFooter.m
//========================自定义back自动返回底部上拉刷新
// //引入#import "MJDIYBackFooter.h" 里面的代码根据需求修改
// self.tab.mj_footer = [MJDIYBackFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
UICollectionView01-上下拉刷新
// 下拉刷新
self.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{// 进入刷新状态后会自动调用这个block
}];// 上拉刷新
self.collectionView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{// 进入刷新状态后会自动调用这个block
}];
UIWebView01-下拉刷新
// 添加下拉刷新控件
self.webView.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{// 进入刷新状态后会自动调用这个block
}];
// 添加刷新框架
//1. 添加下拉刷新 --> 刷出新数据
//typeof ---> 1. 获取括号内的对象的类型 2. 给后面的属性赋值
__weak typeof(self) weakSelf =self;
[self.collectionViewaddLegendHeaderWithRefreshingBlock:^{
//2. 调用加载新数据的方法
[weakSelf loadNewDeals];
}];
//3. 一开始就刷新
[self.collectionView.headerbeginRefreshing];
//4. 添加上拉加载
[self.collectionViewaddLegendFooterWithRefreshingBlock:^{
//5. 调用加载更多数据的方法
[weakSelf loadMoreDeals];
}];
//6. 一开始就隐藏上拉加载
self.collectionView.footer.hidden = YES;
这篇关于iOS MJRefresh的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!