zoukankan      html  css  js  c++  java
  • iOS-Gif图片展示N种方式(原生+第三方)

    原生方法:

    1.UIWebView
    特点:载入速度略长,性能更优。播放的gif动态图更加流畅。

    //动态展示GIF图片-WebView
    -(void)showGifImageWithWebView{
        //读取gif图片数据
        NSData *gifData = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"earthGif" ofType:@"gif"]];
        //UIWebView生成
        UIWebView *imageWebView = [[UIWebView alloc] initWithFrame:CGRectMake(112, 302, 132, 102)];
        //用户不可交互
        imageWebView.userInteractionEnabled = NO;
        //载入gif数据
        [imageWebView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
        //视图加入此gif控件
        [self.view addSubview:imageWebView];
    }

    2.UIImagView
    载入的方式更加高速,性能不如UIWebView,长处:易于扩展

    1)
    添加一个UIImageView的类别(category),添加两个方法
    UIImage+Tool
    .h

    #import <UIKit/UIKit.h>
    
    @interface UIImageView (Tool)
    
    /** 解析gif文件数据的方法 block中会将解析的数据传递出来 */
    -(void)getGifImageWithUrk:(NSURL *)url returnData:(void(^)(NSArray<UIImage *> * imageArray,NSArray<NSNumber *>*timeArray,CGFloat totalTime, NSArray<NSNumber *>* widths, NSArray<NSNumber *>* heights))dataBlock;
    
    /** 为UIImageView加入一个设置gif图内容的方法: */
    -(void)yh_setImage:(NSURL *)imageUrl;
    
    @end

    .m

    //
    //  UIImageView+Tool.m
    //  OneHelper
    //
    //  Created by qiuxuewei on 16/3/2.
    //  Copyright © 2016年 邱学伟. All rights reserved.
    //
    
    #import "UIImageView+Tool.h"
    //要引入ImageIO库
    #import <ImageIO/ImageIO.h>
    
    @implementation UIImageView (Tool)
    
    
    
    //解析gif文件数据的方法 block中会将解析的数据传递出来
    -(void)getGifImageWithUrk:(NSURL *)url returnData:(void(^)(NSArray<UIImage *> * imageArray, NSArray<NSNumber *>*timeArray,CGFloat totalTime, NSArray<NSNumber *>* widths,NSArray<NSNumber *>* heights))dataBlock{
        //通过文件的url来将gif文件读取为图片数据引用
        CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
        //获取gif文件里图片的个数
        size_t count = CGImageSourceGetCount(source);
        //定义一个变量记录gif播放一轮的时间
        float allTime=0;
        //存放全部图片
        NSMutableArray * imageArray = [[NSMutableArray alloc]init];
        //存放每一帧播放的时间
        NSMutableArray * timeArray = [[NSMutableArray alloc]init];
        //存放每张图片的宽度 (一般在一个gif文件里,全部图片尺寸都会一样)
        NSMutableArray * widthArray = [[NSMutableArray alloc]init];
        //存放每张图片的高度
        NSMutableArray * heightArray = [[NSMutableArray alloc]init];
        //遍历
        for (size_t i=0; i<count; i++) {
            CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
            [imageArray addObject:(__bridge UIImage *)(image)];
            CGImageRelease(image);
            //获取图片信息
            NSDictionary * info = (__bridge NSDictionary*)CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
            CGFloat width = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelWidth] floatValue];
            CGFloat height = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelHeight] floatValue];
            [widthArray addObject:[NSNumber numberWithFloat:width]];
            [heightArray addObject:[NSNumber numberWithFloat:height]];
            NSDictionary * timeDic = [info objectForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];
            CGFloat time = [[timeDic objectForKey:(__bridge NSString *)kCGImagePropertyGIFDelayTime]floatValue];
            allTime+=time;
            [timeArray addObject:[NSNumber numberWithFloat:time]];
        }
        dataBlock(imageArray,timeArray,allTime,widthArray,heightArray);
    }
    
    //为UIImageView加入一个设置gif图内容的方法:
    -(void)yh_setImage:(NSURL *)imageUrl{
        __weak id __self = self;
        [self getGifImageWithUrk:imageUrl returnData:^(NSArray<UIImage *> *imageArray, NSArray<NSNumber *> *timeArray, CGFloat totalTime, NSArray<NSNumber *> *widths, NSArray<NSNumber *> *heights) {
            //加入帧动画
            CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
            NSMutableArray * times = [[NSMutableArray alloc]init];
            float currentTime = 0;
            //设置每一帧的时间占比
            for (int i=0; i<imageArray.count; i++) {
                [times addObject:[NSNumber numberWithFloat:currentTime/totalTime]];
                currentTime+=[timeArray[i] floatValue];
            }
            [animation setKeyTimes:times];
            [animation setValues:imageArray];
            [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
            //设置循环
            animation.repeatCount= MAXFLOAT;
            //设置播放总时长
            animation.duration = totalTime;
            //Layer层加入
            [[(UIImageView *)__self layer]addAnimation:animation forKey:@"gifAnimation"];
        }];
    }
    
    @end
    

    在载入gif的地方使用
    导入 UIImageView+Tool

    -(void)showGifImageWithImageView{
    
        UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(112, 342, 132, 102)];
        NSURL * url = [[NSURL alloc]initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"earthGif.gif" ofType:nil]];
        [imageView yh_setImage:url];
        [self.view addSubview:imageView];
    
    }

    第三方:
    1.YLGIFImage
    github链接: https://github.com/liyong03/YLGIFImage

    #import "YLGIFImage.h"
    #import "YLImageView.h"
    
    -(void)showGifImageWithYLImageView{
        YLImageView* imageView = [[YLImageView alloc] initWithFrame:CGRectMake(112, 342, 132, 102)];
        CGFloat centerX = self.view.center.x;
        [imageView setCenter:CGPointMake(centerX, 402)];
        [self.view addSubview:imageView];
        imageView.image = [YLGIFImage imageNamed:@"earthGif.gif"];
    }

    2.FLAnimatedImage
    github链接:https://github.com/Flipboard/FLAnimatedImage

    -(void)showGifImageWithFLAnimatedImage{
        //GIF 转 NSData
        //Gif 路径
        NSString *pathForFile = [[NSBundle mainBundle] pathForResource: @"earthGif" ofType:@"gif"];
        //转成NSData
        NSData *dataOfGif = [NSData dataWithContentsOfFile: pathForFile];
        //初始化FLAnimatedImage对象
        FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:dataOfGif];
        //初始化FLAnimatedImageView对象
        FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] init];
        //设置GIF图片
        imageView.animatedImage = image;
        imageView.frame = CGRectMake(112, 342, 132, 102);
        [self.view addSubview:imageView];
    }
  • 相关阅读:
    [转]windows下mysql配置文件my.ini的位置
    [转]Oracle 11g不能导出空表的多种解决方法
    [转]ORACLE WITH AS 用法(相当于查询开始前构造临时表,提高效率)
    [转]基于WordPress的微信小程序支付功能开发
    从数据库优化到治病(2)治好心悸过程
    算命三十多年的资深命理师的人生感悟!
    从高维度看世界
    鸾书精华
    实用QPS和TPS高的高效分析方法
    windows 安装 mysql
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7265136.html
Copyright © 2011-2022 走看看