美文网首页深入学习iOSiOS_小蟹专题iOS开发技术
iOS刷新第三方MJRefresh的基本使用

iOS刷新第三方MJRefresh的基本使用

作者: 会跳舞的狮子 | 来源:发表于2016-05-17 22:21 被阅读35505次

    iOS开发中最好用的刷新第三方框架 MJRefresh

    GitHub : https://github.com/CoderMJLee/MJRefresh

    UIRefreshControl的介绍

    1,UIRefresh是苹果自带的刷新控件
    2,支持iOS6.0之后的版本
    3,一旦被分配到一个UITableViewController,控件的框架是自动管理

    UIRefreshControl基本使用

    // 刷新中得状态判断,只读属性,根据状态可做一些自定义的事情
    @property (nonatomic, readonly, getter=isRefreshing) BOOL refreshing;
    
    //实例化对象(里面有init,UIRefreshControl的初始化)
     UIRefreshControl *control = [[UIRefreshControl alloc] init];
    
     //设置UIRefreshControl控件的颜色(菊花和文字)
     control.tintColor = [UIColor redColor];
    
     //添加到tableView中,默认尺寸和位置都已经设置好
     [self.tableView addSubview:control];
    
     // 下拉刷新文字描述,自定义
     @property (nonatomic, retain) NSAttributedString *attributedTitle
    
    // 开始刷新
    - (void)beginRefreshing NS_AVAILABLE_IOS(6_0);
    
    // 结束刷新,在确定获得想要的加载数据之后调用
    - (void)endRefreshing NS_AVAILABLE_IOS(6_0);
    

    MJRefresh的介绍

    MJRefresh是继承于UIView的自定义刷新控件
    支持哪些控件的刷新?
    UIScrollView、UITableView、UICollectionView、UIWebView
    从iOS9之后,用MJRefresh框架的时候使用它的属性和方法,大部分需要加入mj_ 开头作为前缀

    • 该框架纯ARC,兼容的系统>=iOS6.0、iPhone\iPad横竖屏

    如果使用MJRefresh

    cocoapods导入:pod 'MJRefresh' (cocoapods另一篇博客里面有写)
    手动导入:
    将MJRefresh文件夹中的所有文件拽入项目中
    导入主头文件:#import "MJRefresh.h"

    #主要是实现上拉刷新和下拉刷新
        //下拉刷新
        self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewTopic)];
    
        //自动更改透明度
        self.tableView.mj_header.automaticallyChangeAlpha = YES;
        
        //进入刷新状态
        [self.tableView.mj_header beginRefreshing];
        
        //上拉刷新
        self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreTopic)];
        //结束头部刷新
        [weakSelf.tableView.mj_header endRefreshing];
    
     //结束尾部刷新
        [weakSelf.tableView.mj_footer endRefreshing];
    

    MJRefresh类结构图

    mjv587.png mj87v5.png

    具体使用

    默认的下拉刷新 - 01

    
        self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
            // 进入刷新状态后会自动调用这个block
        }];
        //或
        // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
        self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
        
        // 马上进入刷新状态
        [self.tableView.header beginRefreshing];
    
    [ (下拉刷新01-普通)(下拉刷新01-普通)

    下拉动画刷新 - 02

     
            // 刷新控件的状态
            typedef NS_ENUM(NSInteger, MJRefreshState) {
            /** 普通闲置状态 */
            MJRefreshStateIdle = 1,
            /** 松开就可以进行刷新的状态 */
            MJRefreshStatePulling,
            /** 正在刷新中的状态 */
            MJRefreshStateRefreshing,
            /** 即将刷新的状态 */
            MJRefreshStateWillRefresh,
            /** 所有数据加载完毕,没有更多的数据了 */
            MJRefreshStateNoMoreData
        };
    
        // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
        MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
        // 设置普通状态的动画图片 (idleImages 是图片)
        [header setImages:idleImages forState:MJRefreshStateIdle];
        // 设置即将刷新状态的动画图片(一松开就会刷新的状态)
        [header setImages:pullingImages forState:MJRefreshStatePulling];
        // 设置正在刷新状态的动画图片
        [header setImages:refreshingImages forState:MJRefreshStateRefreshing];
        // 设置header
        self.tableView.mj_header = header;
    
    [ (下拉刷新02-动画图片)(下拉刷新02-动画图片)

    下拉隐藏的属性

    // 隐藏时间
    header.lastUpdatedTimeLabel.hidden = YES;
    // 隐藏状态
    header.stateLabel.hidden = YES;
    

    自定义的文字和动画图片的设置

    #使用上拉刷新和下拉刷新一般都是自定义头部和尾部的类
    例如: 头部刷新的  
    @interface JHHeader : MJRefreshNormalHeader
    
    #在.m文件中设置
    /** 初始化设置 */
    - (void)prepare
    {
        [super prepare];
        //创建UIImageView
        UIImageView *logoView = [[UIImageView alloc] init];
        //添加图片
        logoView.image = [UIImage imageNamed:@"meinv02"];
        //将该UIImageView添加到当前header中
        [self addSubview:logoView];
        self.logoView = logoView;
        
        //根据拖拽的情况自动切换透明度
        self.automaticallyChangeAlpha = YES;
        
        //隐藏时间
        self.lastUpdatedTimeLabel.hidden = YES;
        
        //设置文字颜色
        self.stateLabel.textColor = [UIColor redColor];
    }
    /**
     *  摆放子控件
     */
    
    - (void)placeSubviews
    {
        [super placeSubviews];
        
        self.logoView.x = 0;
        self.logoView.width = self.width;
        self.logoView.height = 100;
        self.logoView.y =  -self.logoView.height; 
    }
    

    自定义尾部刷新

    例:创建一个JHFooter类 继承于MJRefreshAutoNormalFooter
    @interface JHFooter : MJRefreshAutoNormalFooter
    
    #在.m文件中设置
    /**  初始化 */
    - (void)prepare
    {
        [super prepare];
        
        self.stateLabel.textColor = [UIColor grayColor];
        [self setTitle:@"向上拉加载更多内容喔..." forState:MJRefreshStateIdle];
        [self setTitle:@"正在连接网络加载中...." forState:MJRefreshStateRefreshing];
        
        UISwitch *swith = [[UISwitch alloc] init];
        [self addSubview:swith];
        
        UIImageView *logoView = [[UIImageView alloc] init];
        logoView.image = [UIImage imageNamed:@"meinv02"];
        [self addSubview:logoView];
        self.logoView = logoView;
    }
    
    /**
     *  摆放子控件
     */
    - (void)placeSubviews
    {
        [super placeSubviews];
        
        self.logoView.x = 0;
        self.logoView.y = self.height;
        self.logoView.width = self.width;
        self.logoView.height = 100;
    }
    

    大部分参考自MJRefresh 的 README.md
    该框架还有很多强大的功能,详情可以进入最上面给的github下载地址中查看
    给出的这些应该足够平时的开发,希望多多给建议

    this article author : 会跳舞的狮子
    

    相关文章

      网友评论

      • 你是我此世不渝的执着:用MJ 不能dealloc 怎么解决
      • 陈藩:知道怎么在项目中替换之前的那个MJRefresh么?
        self.header = [MJRefreshHeaderView header];
        self.header.scrollView = self.contentTableView;
        self.header.delegate = self; 就是这种?d
      • 舒耀:点赞 必须点赞
      • 英俊神武:请问一下,上拉的时候自动刷新这个功能怎么实现呢?
        英俊神武:@会跳舞的狮子 内部方法啊,我百度没找到到底是哪个类,哪个属性进行设置
        会跳舞的狮子:@我是宋仲基 框架内部已经实现了 你按照方法就可以了
      • 管饱饱:可以修改刷新时间吗 我想用这个做个淘宝下拉到下一页 上拉到上一页的效果 (最新的已经没有这个效果了)
        Ten_thousand:我解析了API,将数据显示到了cell上,也写了header刷新,如何刷新数据?
        会跳舞的狮子:如果需要做淘宝这种效果的话 完全可以自定义实现
      • 棍武中原:大神你好我想在刷新完把刷新空间隐藏
        会跳舞的狮子:可以设置透明度
      • f92c6bb7dd59:大腿你好 请问 我想做一个类似微信朋友圈的刷新 要怎么改啊 求指导
        会跳舞的狮子:如果需要做朋友圈的那种效果 最好自己自定义做 没必要改这个框架了
      • 小小小阿博er:正准备用,正好温习一下

      本文标题:iOS刷新第三方MJRefresh的基本使用

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