MJRefresh源码阅读

本文详细解析了MJRefresh库的使用方法和源码结构,包括如何添加header和footer,以及MJRefreshComponent、MJRefreshHeader、MJRefreshStateHeader、MJRefreshNormalHeader和MJRefreshGifHeader的工作原理。此外,还探讨了footer的复杂性,如MJRefreshAutoFooter和MJRefreshBackFooter的实现细节。
摘要由CSDN通过智能技术生成

本文对应的MJRefresh版本是3.1.12

使用

MJRefresh的使用很简单,引入MJRefresh.h头文件,然后创建header或者footer赋值给tableView或者collectionView的mj_header或者mj_footer属性。设置好block或者target-action的回调就可以了。

接口也非常简单,如果没有特殊要求,提供的默认的样式已经很好了。同时MJRefresh内置的几个header和footer可以定制不同的样式,如果还不能满足需求,还可以自己写header和footer。

作者GitHub上的示例代码:

  // 下拉刷新
    tableView.mj_header= [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        // 模拟延迟加载数据,因此2秒后才调用(真实开发中,可以移除这段gcd代码)
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // 结束刷新
            [tableView.mj_header endRefreshing];
        });
    }];


  // 上拉刷新
    tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
        // 模拟延迟加载数据,因此2秒后才调用(真实开发中,可以移除这段gcd代码)
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // 结束刷新
            [tableView.mj_footer endRefreshing];
        });
    }];

原理

  1. 通过OC的runtime,在Category中给UIScrollView增加属性,mj_header和mj_footer。
  2. mj_header和mj_footer使用KVO观察UIScrollView的contentOffset属性,根据属性的值判断上拉和下拉的状态。
  3. mj_header和mj_footer的子类负责具体的显示样式和对上拉下拉状态的响应。

源码阅读

主要类图:
这里写图片描述

从引入的头文件开始,MJRefresh.h中又包含了好几个头文件,用途分为3种类型:
第一种是辅助类型的文件:

#import "UIScrollView+MJExtension.h"
#import "UIView+MJExtension.h”

MJExtension的分类都是View上的辅助方法,为了写代码好看用的。比如UIScrollView(MJExtension)中的mj_offsetX属性,getter和setter方法是这样的:

- (CGFloat)mj_offsetX{
    return self.contentOffset.x;
}

- (void)setMj_offsetY:(CGFloat)mj_offsetY{
    CGPoint offset = self.contentOffset;
    offset.y = mj_offsetY;
    self.contentOffset = offset;
}

所以这部分代码可以略过不看。

第二种是MJRefresh提供的header和footer

#import "MJRefreshNormalHeader.h"
#import "MJRefreshGifHeader.h"
#import "MJRefreshBackNormalFooter.h"
...

第三种是UIScrollView的MJRefresh分类。

#import "UIScrollView+MJRefresh.h”

这个是阅读代码的入口。

UIScrollView的mj_header和mj_footer属性</
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值