加载gif图片

#import <UIKit/UIKit.h>


@interface UIImageView (GIF)


// 从指定的路径加载GIF并创建UIImageView

+ (UIImageView *)imageViewWithGIFFile:(NSString *)file frame:(CGRect)frame;


@end





#import "UIImageView+GIF.h"

#import <ImageIO/ImageIO.h>


@implementation UIImageView (GIF)


+ (UIImageView *)imageViewWithGIFFile:(NSString *)file frame:(CGRect)frame

{

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:frame];


    // 加载gif文件数据

    NSData *gifData = [NSData dataWithContentsOfFile:file];


    // GIF动画图片数组

    NSMutableArray *frames = nil;

    // 图像源引用

    CGImageSourceRef src = CGImageSourceCreateWithData((__bridge CFDataRef)gifData, NULL);

    // 动画时长

    CGFloat animationTime = 0.f;


    if (src) {

        // 获取gif图片的帧数

        size_t count = CGImageSourceGetCount(src);

        // 实例化图片数组

        frames = [NSMutableArray arrayWithCapacity:count];


        for (size_t i = 0; i < count; i++) {

            // 获取指定帧图像

            CGImageRef image = CGImageSourceCreateImageAtIndex(src, i, NULL);


            // 获取GIF动画时长

            NSDictionary *properties = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(src, i, NULL);

            NSDictionary *frameProperties = [properties objectForKey:(NSString *)kCGImagePropertyGIFDictionary];

            NSNumber *delayTime = [frameProperties objectForKey:(NSString *)kCGImagePropertyGIFUnclampedDelayTime];

            animationTime += [delayTime floatValue];


            if (image) {

                [frames addObject:[UIImage imageWithCGImage:image]];

                CGImageRelease(image);

            }

        }


        CFRelease(src);

    }


    [imageView setImage:[frames objectAtIndex:0]];

    [imageView setAnimationImages:frames];

    [imageView setAnimationDuration:animationTime];

    [imageView startAnimating];

    

    return imageView;

}


@end




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值