细说 iOS 刷新控件(二)

这一片介绍 MJRefresh 刷新控件原理,也不知道需要几篇。

MJRefresh 如何添加头部试图 ?

答:通过类目和 runtime 方式

1
2
3
4
5
6
7
8
9
10
#import <UIKit/UIKit.h>

@class MJRefreshHeader, MJRefreshFooter;

@interface UIScrollView (MJRefresh)
/** 下拉刷新控件 */
@property (strong, nonatomic) MJRefreshHeader *mj_header;
/** 上拉刷新控件 */
@property (strong, nonatomic) MJRefreshFooter *mj_footer;
@end

文件 UIScrollView+MJRefresh 中为 UIScrollView 添加了 MJRefresh 的类目
接下来看一下 UIScrollView+MJRefresh.m 中设置头部视图的实现,这里本质上是通过 runtimeobjc_setAssociatedObject 函数为 UIScrollView 绑定了 mj_header 属性对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

#pragma mark - header
static const char MJRefreshHeaderKey = '\0';
- (void)setMj_header:(MJRefreshHeader *)mj_header
{
if (mj_header != self.mj_header) {
// 删除旧的,添加新的
[self.mj_header removeFromSuperview];
[self insertSubview:mj_header atIndex:0];

// 存储新的
objc_setAssociatedObject(self, &MJRefreshHeaderKey,
mj_header, OBJC_ASSOCIATION_RETAIN);
}
}

- (MJRefreshHeader *)mj_header
{
return objc_getAssociatedObject(self, &MJRefreshHeaderKey);
}

从上面代码看到,当设定头部视图的时候,首先判断是否一致,然后删除之前的透视图,然后将传入的头部师徒插入到位置 0 ,然后通过 objc_setAssociatedObject() 函数将 mj_header 绑定成 UIScrollView 的对象,同理,当获取头部试图的时候,通过 objc_getAssociatedObject() 就可以得到头部视图 footer 也是一样的操作。

总结:

  1. 下拉刷新的 UI 控件是 UITableView 和 UICollectionView,所以对它们共有的父控件 UIScrollView 采取添加 header 的操作
  2. 类目拓展功能在 iOS 封装组件中常用,比如 SDWebImage 中 UIImageView 的类目方式使用该框架设置图片
  3. 类目不能添加属性,但是可以通过 runtime 的方式做到添加属性,在实现 set/get 放阿飞即可
-------------本文结束谢谢欣赏-------------
Alice wechat