@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; }