iOS加载GIF动画:设置只允许播放一次并增加动画结束回调

西门桃桃 2020-07-14 AM 1601℃ 2条

项目中有个动画效果,设计导出Lottie动画的json文件后,iPhone上Lottie加载动画后显示跟UI设计师的不一样。可能是有兼容问题。

解决方案:

UI设计师导出GIF图,iOS修改为加载GIF图;然后遇到了下面两个问题,现在记录一下:

1、默认直接SDWebImage加载gif图是会无限次播放的,设置animationRepeatCount属性也会无效,这是因为只有当UIImageView中为图片数组时,此属性才会有效果。

NSString *imagePath = [Framework_Bundle pathForResource:@"videoclips_favorite" ofType:@"gif"];
UIImage *favoriteImage = [UIImage sd_imageWithGIFData:[NSData dataWithContentsOfFile:imagePath]];
self.favoriteAnimate = [[UIImageView alloc] initWithImage:favoriteImage];
self.favoriteAnimate.frame = CGRectMake(-2 , -3, 40, 40);
self.favoriteAnimate.animationRepeatCount = 1;
[self addSubview:self.favoriteAnimate];

解决方案:取出UIImage中的全部图片给UIImageView控制,此时就可以设置只允许播放一次。

NSString *imagePath = [Framework_Bundle pathForResource:@"videoclips_favorite" ofType:@"gif"];
UIImage *favoriteImage = [UIImage sd_imageWithGIFData:[NSData dataWithContentsOfFile:imagePath]];
self.favoriteAnimate = [[UIImageView alloc] init];
self.favoriteAnimate.frame = CGRectMake(-2 , -3, 40, 40);
self.favoriteAnimate.animationImages = favoriteImage.images;
self.favoriteAnimate.animationDuration = favoriteImage.duration;
self.favoriteAnimate.animationRepeatCount = 1;
[self addSubview:self.favoriteAnimate];

2、UIImageView做序列帧动画结束后没有动画结束的回调,但是有些代码需要动画结束后才执行。

解决方案:没有回调我们就只能计算,通过轮数和播放一轮的时间数的乘积获取到动画时间,然后延迟执行。

[self.favoriteAnimate startAnimating];
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self performSelector:@selector(animationDidFinish) withObject:self afterDelay:self.favoriteAnimate.animationRepeatCount * self.favoriteAnimate.animationDuration];

第三方gif动画框架:FLAnimatedImage之类,以后有空尝试一下。

标签: iOS, GIF, 图片处理

非特殊说明,本博所有文章均为博主原创。

评论啦~



已有 2 条评论


  1. 谷先生
    谷先生

    为何播放一次就消失了呢?

    回复 2021-04-15 11:49
    1. 西门桃桃
      西门桃桃 博主

      你看下你的GIF图的最后一帧是不是透明的

      回复 2021-06-10 16:15