美文网首页
MJRefresh源码阅读(四)

MJRefresh源码阅读(四)

作者: 落叶兮兮 | 来源:发表于2020-07-01 16:33 被阅读0次

上一篇[MJRefresh源码阅读(三)](https://www.jianshu.com/p/ad830ae7694d)介绍了MJRefreshStateHeader类,这次介绍MJRefreshNormalHeader,这是默认的下拉刷新控件,继承于MJRefreshStateHeader。
这里比较简单,主要就是在重写的父类的setState中添加操作,改变箭头和加载的菊花标志,相关的代码为:

- (void)setState:(MJRefreshState)state {
    MJRefreshCheckState
    
    // 根据状态做事情
    if (state == MJRefreshStateIdle) {
        if (oldState == MJRefreshStateRefreshing) {
            self.arrowView.transform = CGAffineTransformIdentity;
            
            [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{
                self.loadingView.alpha = 0.0;
            } completion:^(BOOL finished) {
                // 如果执行完动画发现不是idle状态,就直接返回,进入其他状态
                if (self.state != MJRefreshStateIdle) return;
                
                self.loadingView.alpha = 1.0;
                [self.loadingView stopAnimating];
                self.arrowView.hidden = NO;
            }];
        } else {
            [self.loadingView stopAnimating];
            self.arrowView.hidden = NO;
            [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{
                self.arrowView.transform = CGAffineTransformIdentity;
            }];
        }
    } else if (state == MJRefreshStatePulling) {
        [self.loadingView stopAnimating];
        self.arrowView.hidden = NO;
        [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{
            self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI);
        }];
    } else if (state == MJRefreshStateRefreshing) {
        self.loadingView.alpha = 1.0; // 防止refreshing -> idle的动画完毕动作没有被执行
        [self.loadingView startAnimating];
        self.arrowView.hidden = YES;
    }
}

另外,和该文件并列的MJRefreshGifHeaderView是带动图的下拉刷新控件,同样是继承于MJRefreshStateHeader。
在该文件中,实现动态图使用的是UIImageView实现的动态图,UIImageView有个animationedImage属性,将一组图片数组赋予它,即可实现简单的动图效果.
相应的代码如下:

- (void)setState:(MJRefreshState)state
{
    MJRefreshCheckState
    
    // 根据状态做事情
    if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) {
        NSArray *images = self.stateImages[@(state)];
        if (images.count == 0) return;
        
        [self.gifView stopAnimating];
        if (images.count == 1) { // 单张图片
            self.gifView.image = [images lastObject];
        } else { // 多张图片
            self.gifView.animationImages = images;
            self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue];
            [self.gifView startAnimating];
        }
    } else if (state == MJRefreshStateIdle) {
        [self.gifView stopAnimating];
    }
}

相关文章

  • MJRefresh源码阅读3——干货整理

    前言 MJRefresh源码阅读1——结构梳理MJRefresh源码阅读2——核心类MJRefreshHeader...

  • MJRefresh

    MJRefresh原理分析从MJRefresh源码学习上拉下刷新的基本原理MJRefresh源码阅读使用Xtrac...

  • MJRefresh源码阅读(四)

    上一篇[MJRefresh源码阅读(三)](https://www.jianshu.com/p/ad830ae76...

  • MJRefresh 源码阅读

    MJRefresh项目地址 https://github.com/CoderMJLee/MJRefresh下载下来...

  • MJRefresh源码阅读

    可改进部分 在 MJRefreshComponent.h 的 34 行, typedef void (^MJRef...

  • MJRefresh 源码阅读

    1、Runtime1.1 关联对象该框架为UIScrollView添加了两个“成员变量”,header和foote...

  • 阅读MJRefresh源码

    该框架的结构设计得很清晰,使用一个基类MJRefreshComponent来做一些基本的设定,然后通过继承的方式,...

  • 阅读MJRefresh源码

    先看一下源码目录结构: 1.Base MJRefreshComponent:基类(继承至UIView) ``` /...

  • MJRefresh源码阅读

    很多项目的上拉加载下拉刷新功能都是基于MJRefresh来实现的,下面通过源码来分析几个问题。 一、下拉刷新时,M...

  • 我对MJRefresh框架的了解 -> MJRefresh

    MJRefresh源码地址:CoderMJLee/MJRefresh · GitHub 一、基本结构 github...

网友评论

      本文标题:MJRefresh源码阅读(四)

      本文链接:https://www.haomeiwen.com/subject/lefhqktx.html