美文网首页
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源码阅读(四)

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