姬長信(Redy)

MJRefresh源码解读

MJRefresh是MJ大神写的一个实现上拉刷新和下拉刷新的第三方库,这个库目前在很多有名的应用上都有使用看,下面就来分析一下MJRefresh的源码。

1.简单应用

下面创建一个绿色的UIScrollview,然后在UIScrollview上加上一个红色的视图作为子视图:

self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(020, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
    self.scrollView.backgroundColor = [UIColor greenColor];
    [self.view addSubview:_scrollView];

    self.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refresh)];

    self.scrollView.contentInset = UIEdgeInsetsMake(54000);

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(00self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
    view.backgroundColor = [UIColor redColor];
    [self.scrollView addSubview:view];

然后我们看一下效果:

在这里我们设置的contentInset.top = 54,54正是这个下拉控件的高度,所以整个下拉控件是完全可见的。

2.源码分析

我们首先看一下MJRefresh的源码的类的结构,由于上拉刷新和下拉刷新控件的原理基本一致,因此这里我们仅使用下拉刷新控件来分析:

下面我们从下拉刷新控件的使用开始来探索源码:

self.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refresh)];

首先我们的疑问是UIScrollview的mj_header这个属性是哪里来的?我们找到UIScrollview+MJRefresh.h这个文件,这是写的UIScrollview的一个分类,在这个分类中我们找到了mj_header属性,mj_footer属性,但是分类申明属性是没有set方法和get方法的,那么怎么去赋值和取值呢?这时候就要用到runtime的关联属性方法了,我们在UIScrollview+MJRefresh.m文件中找到- (void)setMj_header:(MJRefreshHeader *)mj_header方法看看是不是像我猜想的那样: