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

西门桃桃 2020-07-14 AM 207℃ 0条

项目中有个动画效果,设计导出Lottie动画的json文件后,iPhone上Lottie加载动画后显示跟设计的不一样。可能是有兼容问题。解决方案是通过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, 图片处理

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

评论啦~