优雅的自定义上下拉刷新动画

2,466 阅读1分钟
原文链接: www.jianshu.com
  • 目的:实现自定义的上下拉刷新动画,尽可能少的代码侵入性。
  • 轮子:MJRefresh
  • 大多数方案:继承MJRefresh的相关组件,如MJRefreshGifHeaderMJRefreshAutoGifFooter,然后使用自定义的控件。
  • 缺点:不够雅观,因为我还要自己取一个名字才行。。。总之,不如直接用MJ的6。
  • 解决方案:GifRefreshCategory,里面有MJRefreshGifHeaderMJRefreshAutoGifFooter的两个分类,把文件拖入项目后,再换一换图片就能用了,怎么用,当然是不用你写一行代码,还是用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?

此处应有demo