iOS对MJRefresh的二次封装(YMRefresh刷新)
2016-11-30 本文已影响2048人
西河老伯
最近在项目中使用到下拉刷新和上拉加载的需求,用的就是MJ的刷新控件,但是用起来代码量太大不是很简洁,所以就对MJRefresh做了一次封装,封装之后只需要调用一个方法,实现方法中的block回调就OK了,话不多说,一起来看代码.
YMRefresh
(GitHub上Demo地址:https://github.com/xihelaobo/YMRefreshDemo.git)
//当前类的封装都是基于MJRefresh的(当前类为对MJRefresh的二次封装)
//当前类的使用需要先导入MJRefresh三方库,git上有下载哦!
//当前类提供了两个刷新的方法(正常模式和gif模式)
//先看一下封装类的.h文件
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, RefreshType) {
RefreshTypeDropDown = 0, //只支持下拉
RefreshTypeUpDrop = 1, //只支持上拉
RefreshTypeDouble = 2, //支持上拉和下拉
};
@interface YMRefresh : NSObject
//正常模式上拉下拉刷新
- (void)normalModelRefresh:(UITableView *)tableView refreshType:(RefreshType)refreshType firstRefresh:(BOOL)firstRefresh timeLabHidden:(BOOL)timeLabHidden stateLabHidden:(BOOL)stateLabHidden dropDownBlock:(void(^)(void))dropDownBlock upDropBlock:(void(^)(void))upDropBlock;
//gifRefresh
- (void)gifModelRefresh:(UITableView *)tableView refreshType:(RefreshType)refreshType firstRefresh:(BOOL)firstRefresh timeLabHidden:(BOOL)timeLabHidden stateLabHidden:(BOOL)stateLabHidden dropDownBlock:(void(^)(void))dropDownBlock upDropBlock:(void(^)(void))upDropBlock;
//后期如果有需要还要对diy的模式进行封装
@end
//再来看一下.m文件
#import "YMRefresh.h"
#import "MJRefresh.h"
@interface YMRefresh () {
NSArray *idleImages;
NSArray *pullingImages;
NSArray *refreshingImages;
}
//下拉时候触发的block
@property (nonatomic, copy) void(^DropDownRefreshBlock)(void);
//上拉时候触发的block
@property (nonatomic, copy) void(^UpDropRefreshBlock)(void);
//接收传递过来的参数
@property (nonatomic, strong) UITableView *parameterTableView;
@end
@implementation YMRefresh
- (instancetype)init {
if (self = [super init]) {
//此gif为逐帧动画由多张图片组成(Image(@"Image")写法和[UIImage imageNamed:@"Image"])
//闲置状态下的gif(就是拖动的时候变化的gif)
idleImages = [[NSArray alloc] initWithObjects:Image(@"Image"), Image(@"Image1"), Image(@"Image2"), Image(@"Image3"), Image(@"Image4"), Image(@"Image5"), nil];
//已经到达偏移量的gif(就是已经到达偏移量的时候的gif)
pullingImages = [[NSArray alloc] initWithObjects:Image(@"Image"), Image(@"Image1"), Image(@"Image2"), Image(@"Image3"), Image(@"Image4"), Image(@"Image5"), nil];
//正在刷新的时候的gif
refreshingImages = [[NSArray alloc] initWithObjects:Image(@"Image"), Image(@"Image1"), Image(@"Image2"), Image(@"Image3"), Image(@"Image4"), Image(@"Image5"), nil];
}
return self;
}
//正常模式下拉上拉刷新(firstRefresh第一次进入的时候是否要刷新,这个值只对下拉刷新有影响)(refreshType设置为只支持上拉或者下拉的时候,将另外一个block置为nil)
- (void)normalModelRefresh:(UITableView *)tableView refreshType:(RefreshType)refreshType firstRefresh:(BOOL)firstRefresh timeLabHidden:(BOOL)timeLabHidden stateLabHidden:(BOOL)stateLabHidden dropDownBlock:(void(^)(void))dropDownBlock upDropBlock:(void(^)(void))upDropBlock {
_parameterTableView = tableView;
if (refreshType == RefreshTypeDropDown) {
//只支持下拉
//将block传入
self.DropDownRefreshBlock = dropDownBlock;
//初始化
MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(dropDownBlockAction)];
//是否隐藏上次更新的时间
header.lastUpdatedTimeLabel.hidden = timeLabHidden;
//是否隐藏刷新状态label
header.stateLabel.hidden = stateLabHidden;
//tableView.mj_header接收header
tableView.mj_header = header;
//首次进来是否需要刷新
if (firstRefresh) {
[tableView.mj_header beginRefreshing];
}
//透明度渐变
tableView.mj_header.automaticallyChangeAlpha = YES;
}else if (refreshType == RefreshTypeUpDrop) {
//只支持上拉
//传入block
self.UpDropRefreshBlock = upDropBlock;
//初始化并指定方法
tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(upDropBlockAction)];
//指定数据加载完毕的文字
[(MJRefreshAutoNormalFooter *)tableView.mj_footer setTitle:@"哥,这下真没了!" forState:MJRefreshStateNoMoreData];
}else if (refreshType == RefreshTypeDouble) {
//上拉和下拉都持支持
//下拉
//将block传入
self.DropDownRefreshBlock = dropDownBlock;
//初始化
MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(dropDownBlockAction)];
//是否隐藏上次更新的时间
header.lastUpdatedTimeLabel.hidden = timeLabHidden;
//是否隐藏刷新状态label
header.stateLabel.hidden = stateLabHidden;
//tableView.mj_header接收header
tableView.mj_header = header;
//首次进来是否需要刷新
if (firstRefresh) {
[tableView.mj_header beginRefreshing];
}
//透明度渐变
tableView.mj_header.automaticallyChangeAlpha = YES;
//上拉
//将block传入
self.UpDropRefreshBlock = upDropBlock;
//初始化并指定方法
tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(upDropBlockAction)];
//指定数据加载完毕的文字
[(MJRefreshAutoNormalFooter *)tableView.mj_footer setTitle:@"哥,这下真没了!" forState:MJRefreshStateNoMoreData];
}
}
//gifRefresh
- (void)gifModelRefresh:(UITableView *)tableView refreshType:(RefreshType)refreshType firstRefresh:(BOOL)firstRefresh timeLabHidden:(BOOL)timeLabHidden stateLabHidden:(BOOL)stateLabHidden dropDownBlock:(void(^)(void))dropDownBlock upDropBlock:(void(^)(void))upDropBlock {
_parameterTableView = tableView;
if (refreshType == RefreshTypeDropDown) {
//只支持下拉
self.DropDownRefreshBlock = dropDownBlock;
MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(dropDownBlockAction)];
[header setImages:idleImages forState:MJRefreshStateIdle];
[header setImages:pullingImages forState:MJRefreshStatePulling];
[header setImages:refreshingImages forState:MJRefreshStateRefreshing];
header.lastUpdatedTimeLabel.hidden = YES;
header.lastUpdatedTimeLabel.hidden = timeLabHidden;
header.stateLabel.hidden = stateLabHidden;
tableView.mj_header = header;
if (firstRefresh) {
[tableView.mj_header beginRefreshing];
}
}else if (refreshType == RefreshTypeUpDrop) {
//只支持上拉
self.UpDropRefreshBlock = upDropBlock;
//初始化并指定方法
tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(upDropBlockAction)];
//指定数据加载完毕的文字
[(MJRefreshAutoNormalFooter *)tableView.mj_footer setTitle:@"哥,这下真没了!" forState:MJRefreshStateNoMoreData];
}else if (refreshType == RefreshTypeDouble) {
//支持上拉和下拉加载
self.DropDownRefreshBlock = dropDownBlock;
MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(dropDownBlockAction)];
[header setImages:idleImages forState:MJRefreshStateIdle];
[header setImages:pullingImages forState:MJRefreshStatePulling];
[header setImages:refreshingImages forState:MJRefreshStateRefreshing];
header.lastUpdatedTimeLabel.hidden = YES;
header.lastUpdatedTimeLabel.hidden = timeLabHidden;
header.stateLabel.hidden = stateLabHidden;
tableView.mj_header = header;
if (firstRefresh) {
[tableView.mj_header beginRefreshing];
}
self.UpDropRefreshBlock = upDropBlock;
//初始化并指定方法
tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(upDropBlockAction)];
//指定数据加载完毕的文字
[(MJRefreshAutoNormalFooter *)tableView.mj_footer setTitle:@"哥,这下真没了!" forState:MJRefreshStateNoMoreData];
}
}
//下拉时候触发的block
- (void)dropDownBlockAction {
if (_DropDownRefreshBlock) {
_DropDownRefreshBlock();
[_parameterTableView.mj_footer resetNoMoreData];
}
}
//上拉时候触发的block
- (void)upDropBlockAction {
if (_UpDropRefreshBlock) {
_UpDropRefreshBlock();
}
}
@end
//再来看一下在控制器中的调用
//声明一个YMRefresh的属性
@property(nonatomic, strong) YMRefresh *ymRefresh;
//YMRefresh调用
//当然了第一步当然是要初始化啦!
_ymRefresh = [[YMRefresh alloc] init];
// 正常情况下的调用例子(下面的六个例子可以根据业务选择性的使用)
// 注:下面的调用可以放在viewDidLoad方法中实现
//eg:1
[_ymRefresh normalModelRefresh:_tableView refreshType:RefreshTypeDropDown firstRefresh:NO timeLabHidden:NO stateLabHidden:YES dropDownBlock:^{
NSLog(@"只支持下拉");
if ([weakSelf.tableView.mj_header isRefreshing]) {
[weakSelf.tableView.mj_header endRefreshing];
}
} upDropBlock:nil];
//eg:2
[_ymRefresh normalModelRefresh:_tableView refreshType:RefreshTypeUpDrop firstRefresh:NO timeLabHidden:NO stateLabHidden:NO dropDownBlock:nil upDropBlock:^{
NSLog(@"只支持上拉");
if ([weakSelf.tableView.mj_footer isRefreshing]) {
[weakSelf.tableView.mj_footer endRefreshing];
}
}];
//eg:3
[_ymRefresh normalModelRefresh:_tableView refreshType:RefreshTypeDouble firstRefresh:NO timeLabHidden:NO stateLabHidden:YES dropDownBlock:^{
NSLog(@"下拉");
if ([weakSelf.tableView.mj_header isRefreshing]) {
[weakSelf.tableView.mj_header endRefreshing];
}
} upDropBlock:^{
NSLog(@"上拉");
if ([weakSelf.tableView.mj_footer isRefreshing]) {
[weakSelf.tableView.mj_footer endRefreshing];
}
}];
// gif情况下的调用
//eg.1
[_ymRefresh gifModelRefresh:_tableView refreshType:RefreshTypeDropDown firstRefresh:NO timeLabHidden:YES stateLabHidden:NO dropDownBlock:^{
NSLog(@"gif下拉");
if ([weakSelf.tableView.mj_header isRefreshing]) {
[weakSelf.tableView.mj_header endRefreshing];
}
} upDropBlock:nil];
//eg.2
[_ymRefresh gifModelRefresh:_tableView refreshType:RefreshTypeUpDrop firstRefresh:NO timeLabHidden:NO stateLabHidden:NO dropDownBlock:nil upDropBlock:^{
NSLog(@"gif上拉");
if ([weakSelf.tableView.mj_footer isRefreshing]) {
[weakSelf.tableView.mj_footer endRefreshing];
}
}];
//eg.3
[_ymRefresh gifModelRefresh:_tableView refreshType:RefreshTypeDouble firstRefresh:NO timeLabHidden:YES stateLabHidden:NO dropDownBlock:^{
if ([weakSelf.tableView.mj_header isRefreshing]) {
[weakSelf.tableView.mj_header endRefreshing];
}
} upDropBlock:^{
if ([weakSelf.tableView.mj_footer isRefreshing]) {
[weakSelf.tableView.mj_footer endRefreshing];
}
}];
如果你感觉对你有帮助,请留言或者关注我的微信公众号//西河老伯iOS开发//来支持我!