在iOS14之后,使用imageIo 内的CGImageDestinationAddImage合成的gif在YYAnimatedImageView上只播放了一次就停止了,没有无限循环播放。

在网上查了很多,gif的播放次数与内部kCGImagePropertyGIFLoopCount这个参数有关。我自己生成的gif,转成NSData后,去获取loopcount不为0,这里的gifProperty有时候为nil最后也打印为0,因为 gifProperty 字典返回的是对象而不是原始类型。返回的对象是NSNumber,其默认值转换为int 0 。我没有检查 nil 。该属性不循环时不 存在

-(void)prepareGif:(NSData*)data {
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef) data, NULL);
    CFDictionaryRef properties = CGImageSourceCopyProperties(source, nil);
    NSDictionary* imageProperties = (__bridge NSDictionary*) properties;
    NSDictionary* gifProperty = imageProperties[(NSDictionary*) kCGImagePropertyGIFDictionary];
    int loopCount = [gifProperty[(NSString*) kCGImagePropertyGIFLoopCount] intValue]; // returns 0 for LoopCount 1 and LoopCount 0 and returns 1 for LoopCount 2
    NSLog(@" --- %d",loopCount);

YYImage作者已经停更了好很多年了,所以我们使用FLAnimatedImage,在FLAnimatedImage.m中加入image.loopCount = 0来解决。

- (instancetype)initWithAnimatedGIFData:(NSData *)data
    FLAnimatedImage *image = [self initWithAnimatedGIFData:data optimalFrameCacheSize:0 predrawingEnabled:YES];
    image.loopCount = 0;
    return image;
_imageView.animatedImage = [FLAnimatedImage animatedImageWithGIFData:data];
因此在iOS14下点击预览图片,图片内容显示不出来,变成黑屏。 原因:iOS 14系统调用方法- (void)displayLayer:(CALayer *)layer,YYAnimatedImageView没有正确处理。 解决办法: 添加YYAnimatedImageView的category,并且用钩子把- (void)displayLayer:(CALayer *)layer方法给替换,代码 //1.初始化YYAnimatedImageView YYAnimatedImageView *imageView = [[YYAnimatedImageView alloc] init]; imageView.backgroundColor = [UIColor whiteColor]; imageView.contentMode = UIViewContentModeScaleAspect...
YYImage 框架使用教程 YYImageImage framework for iOS to display/encode/decode animated WebP, APNG, GIF, and more.项目地址:https://gitcode.com/gh_mirrors/yy/YYImage 1. 项目目录结构及介绍 YYImage框架的主要文件结构如下: YYImage:这是框架...
// animatedIV就是YYAnimatedImageView [self.animatedIV addObserver:self forKeyPath:@"currentAnimatedImageIndex" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil]; NSData *data = [N
升级到iOS14,之前使用的YYimage框架全部不能正常显示图片 原因是:14.0 系统调用了下面方法,YYAnimatedImageView没有正确处理 *-(void)displayLayer:(CALayer )layer; 可以用以下方式处理: 更改YYimage源码,在YYAnimationImageView.m中 - (void)displayLayer:(CALayer *)layer { if (_curFrame) { layer.contents =
由于浏览器对图片有缓存的机制,所以对于一次性型的gif图,只会加载动效一次,后面再次使用时就不会出现我们想要的效果,因此我们需要解决这种缓存问题,可以使用添加时间戳的问题让浏览器认为这不是同一张gif图,从而再次加载图片,实现每次都有动效。 <img v-show="show" :src="onceImg" /> <script> export default { name: 'home', data() { return { show: true,
1.使用UIWebView播放 #pragma clang diagnostic ignored "-Wnonnull" NSString *path = [[NSBundle mainBundle] pathForResource:@"<#gifName#>" ofType:@"gif"]; NSData *gifData = [NSData dataWithCont...
1.网络路径下的gif播放 引用头文件#import “UIImageView+WebCache.h” UIImageView *imageView = [[UIImageView alloc] init]; imageView.frame = CGRectMake(10, 100, 300, 300); NSString *urlStr = @...
前言:为了在tableview 中更刘畅的加载 gif图片 1、使用 SDWebImage 的 SDAnimatedImageView 加载 gif 图片,少量无伤大雅,可以使用,大量会导致卡顿、崩溃 2、使用 YYWebImage 的 YYAnimatedImageView 加载 gif 图片,效果非常好,在 tableview 里边中没有卡顿现象, 3、使用 swift 的 Kingfisher 中的 AnimatedImageView 加载 gif 图片,这个和 SDWebImage 效果相差不大