项目中有个动画效果,设计导出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之类,以后有空尝试一下。
为何播放一次就消失了呢?
你看下你的GIF图的最后一帧是不是透明的