在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 “UI
ImageView+WebCache.h”
UI
ImageView *
imageView = [[UI
ImageView 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 效果相差不大