- 目的:实现自定义的上下拉刷新动画,尽可能少的代码侵入性。
- 轮子:MJRefresh
- 大多数方案:继承
MJRefresh
的相关组件,如MJRefreshGifHeader
,MJRefreshAutoGifFooter
,然后使用自定义的控件。 - 缺点:不够雅观,因为我还要自己取一个名字才行。。。总之,不如直接用MJ的6。
- 解决方案:GifRefreshCategory,里面有
MJRefreshGifHeader
和MJRefreshAutoGifFooter
的两个分类,把文件拖入项目后,再换一换图片就能用了,怎么用,当然是不用你写一行代码,还是用MJ系列的。
具体实现代码(以header
为例):
@implementation MJRefreshGifHeader (Category)
+ (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL swizzleSelectors[2] = {
@selector(prepare),
@selector(placeSubviews)
};
for (int i = 0; i < 1; i++) {
SEL selector = swizzleSelectors[i];
NSString *newSelectorStr = [NSString stringWithFormat:@"header_%@", NSStringFromSelector(selector)];
Method originMethod = class_getInstanceMethod(self, selector);
Method swizzledMethod = class_getInstanceMethod(self, NSSelectorFromString(newSelectorStr));
method_exchangeImplementations(originMethod, swizzledMethod);
}
});
}
- (void)header_prepare{
[self header_prepare];//先调用原来的方法
NSMutableArray *idleImages = [NSMutableArray array];//定义数组存储图片
for (int i = 0; i<6; i++) {
NSString *imgName = [NSString stringWithFormat:@"loading0%d",i+1];
UIImage *img = [UIImage imageNamed:imgName];
[idleImages addObject:img];
}
self.lastUpdatedTimeLabel.hidden = YES;
self.stateLabel.hidden = YES;
self.gifView.centerX = WIDTH/2;
// 设置普通状态的动画图片
[self setImages:idleImages forState:MJRefreshStateIdle];
// 设置即将刷新状态的动画图片(一松开就会刷新的状态)
[self setImages:idleImages forState:MJRefreshStatePulling];
// 设置正在刷新状态的动画图片
[self setImages:idleImages forState:MJRefreshStateRefreshing];
}
- (void)header_placeSubviews{
[self header_placeSubviews];
}
@end
使用时不需要引入头文件,直接用MJ的即可:
MJRefreshGifHeader *_refreshHeader;
_refreshHeader = [MJRefreshGifHeader headerWithRefreshingBlock:^{
[self requestData:1];
}];
_tableView.mj_header = _refreshHeader;
是不是很easy?