• UIImageView关键帧动画,监听动画结束的回调


    @interface DBAnimationView () <CAAnimationDelegate>
    
    @property (strong, nonatomic) NSMutableArray *imageArrM;
    
    @end
    
    @implementation DBAnimationView
    
    -(instancetype)initWithFrame:(CGRect)frame {
        if (self = [super initWithFrame:frame]) {
            [self addSubview:self.animationImageView];
        }
        return self;
    }
    
    - (void)startAnimation {
        [self.imageArrM removeAllObjects];
        for(NSInteger i = 0; i < 51; i++){
            // 使用imageWithContentsOfFile加载图片,不会导致内存过大,因为该方法不会缓存,帧动画只使用一次的情况下用。
            NSString *imagePath = [[NSBundle mainBundle]pathForResource:[NSString stringWithFormat:@"3_00%02ld.jpg", i] ofType:nil];
            UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
            CGImageRef cgImage = image.CGImage;
            [self.imageArrM addObject:(__bridge UIImage * _Nonnull)(cgImage)];
        }
        
        // UIImageView 关键帧动画
        CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
        // 动画结束之后的回调
        animation.delegate = self;
        animation.duration = 2.0;
        animation.repeatCount = 1;
        // 设置animation的唯一标示,这样在delegate回调的时候能够区分开来
        [animation setValue:@"animation1" forKey:@"customType"];
        animation.values = self.imageArrM;
        [self.animationImageView.layer addAnimation:animation forKey:@""];
    }
    
    -(void)animationDidStart:(CAAnimation *)anim {
        NSString *keyPathValue = [anim valueForKey:@"customType"];
        if ([keyPathValue isEqualToString:@"animation1"]) {
            NSLog(@"动画开始了。。。。");
            // 动画开始后,设置为最后一张图片,如果在动画结束时再设置,可能会出现图片跳动。
            _animationImageView.image = [UIImage imageNamed:@"3_0050.jpg"];
        }
    }
    -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
        NSString *keyPathValue = [anim valueForKey:@"customType"];
        if ([keyPathValue isEqualToString:@"animation1"]) {
            // 释放内存
            _imageArrM = nil;
            // 如果上层需要处理,回调给上层
            if (self.Completion) {
                self.Completion();
            }
        }
    }
    
    -(UIImageView *)animationImageView {
        if (!_animationImageView) {
            // 设置初始图片
            _animationImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"3_0000.jpg"]];
            _animationImageView.frame = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
            _animationImageView.contentMode = UIViewContentModeScaleAspectFit;
        }
        return _animationImageView;
    }
    
    -(NSMutableArray *)imageArrM {
        if (!_imageArrM) {
            _imageArrM = [NSMutableArray array];
        }
        return _imageArrM;
    }
  • 相关阅读:
    从一个Fragment跳转到另一个Fragment
    网站关键字排名查询
    wordpress添加百度统计
    WordPress:自定义页面模板
    wordpress的系统卡
    Android APK反编译就这么简单 详解(附图)
    关于使用apktool可以反编译无法回编译的解决问题
    移动广告联盟
    android studio 设备 unauthorized 问题解决
    使用Android Studio开发遇到的问题集合
  • 原文地址:https://www.cnblogs.com/dashengios/p/14929992.html
Copyright © 2020-2023  润新知