美文网首页iOS封装自己尝试等装一下
iOS对MJRefresh的二次封装(YMRefresh刷新)

iOS对MJRefresh的二次封装(YMRefresh刷新)

作者: 西河老伯 | 来源:发表于2016-11-30 16:07 被阅读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开发//来支持我!

相关文章

  • iOS对MJRefresh的二次封装(YMRefresh刷新)

    最近在项目中使用到下拉刷新和上拉加载的需求,用的就是MJ的刷新控件,但是用起来代码量太大不是很简洁,所以就对MJR...

  • 2018-05-28

    对MJRefresh.h再次封装,上拉加载更多,下拉刷新 在公司称着没事的时间随便写写,自己对MJRefresh再...

  • 解决MJRefresh上下拉刷新无法收回

    //解决MJRefresh上下拉刷新无法收回if (@available(iOS 11.0, *)) {self....

  • 初识SwipeRefreshLayout

    异于Mj大神的MJRefresh的iOS的刷新框架,Android的刷新Google官方仅提供了下拉刷新控件Swi...

  • iOS 刷新MJRefresh

    作为一个iOS的开发人员,总是感觉刷新这个东西不是很难,但是每次都要找控件比较闹心,所以在这记录一下上拉下拉的代码...

  • 一些MJRefresh的坑

    1.MJRefresh(主要封装了六种刷新控件) 主要使用以下几个 MJRefreshNormalHeader M...

  • iOS-MJRefresh源码解析

    MJRefresh在iOS中是一个简单实用功能强大的刷新的控件。可定制很高,几乎可以满足大部分的App对刷新控件的...

  • iOS 使用MJRefresh上拉只刷新一次问题

    iOS使用MJRefresh上拉刷新只刷新一次问题 解决方案: 我们只需要在不同的刷新请求之后调用相应的停...

  • 刷新MJRefresh

    刷新MJRefresh

  • UITableView的基本使用

    一、常用方法 二、上拉刷新,下拉刷新 MJRefresh下拉刷新(上拉加载)使用详解MJRefresh下拉刷新三方...

网友评论

  • 长衣貌:作者您好,下拉刷新后不执行回调块啊!
  • 57da9bd21220:为啥我在自定义的tableView里面不走block
    贴上代码:
    -(void)normalModelRefresh:(UITableView *)tableView refreshType:(RefreshType)refreshType firstRefresh:(BOOL)firstRefresh timeLabHidden:(BOOL)timeLabHidden stateLabHidden:(BOOL)stateLabHidden dropDownBlock:(void(^)(void))dropDownBlock upDropBlock:(void(^)(void))upDropBlock{

    YMRefresh *Refresh = [[YMRefresh alloc] init];
    [Refresh normalModelRefresh:tableView refreshType:refreshType firstRefresh:firstRefresh timeLabHidden:timeLabHidden stateLabHidden:stateLabHidden dropDownBlock:dropDownBlock upDropBlock:upDropBlock];

    }
  • 闲来读者:你好,好像有个问题,我上拉刷新的时候只能上拉一次,第二次上拉刷新不走block里面
    闲来读者:@西河老伯 不是的,我测过了,你可以测试一下
    闲来读者:不是的,我测了,你可以测一下
    西河老伯:@闲来读者 是不是你的数据已经加载完了?
  • 闲来读者:好像只支持uitableview,不支持uicollectionView
    西河老伯:理论上说是可以的
    闲来读者:@西河老伯 可以把UITableView改成UIScrollView就都可以适配了
  • 懒羊羊_4bdf:为毛必须要定义一个全局的变量,否则不执行 block?:smirk:
    西河老伯:@懒羊羊_4bdf 在iOS 开发中,使用某个类的时候首先是要实例化一个对象,然后对象去调用他相应的方法和属性。面向对象的编程思想,你再体会一下。
    懒羊羊_4bdf:@西河老伯 比如说我在某个类中使用了下拉刷新,此时必须定义一个全局的YMRefresh变量,初始化之后再调用相应的方法,但是,如果不定义全局的变量,初始化之后调用方法时 block不执行
    西河老伯:@懒羊羊_4bdf 具体点
  • 这小子:你这个停止刷新还需要在控制器中引用@import "MJRefresh.h",做自定义动画非常不错
    西河老伯:@这小子1992 这个MJRefresh.h你也可以引入到你的全局.pch文件中这样就不用再在你的控制器中引入了。

本文标题:iOS对MJRefresh的二次封装(YMRefresh刷新)

本文链接:https://www.haomeiwen.com/subject/bojtmttx.html