IOS开发入门之iOS开发中实现显示gif图片教程
凌雪 2018-10-10 来源 :网络 阅读 1342 评论 0

摘要:本文将带你了解IOS开发入门iOS开发中实现显示gif图片教程,希望本文对大家学IOS有所帮助。

本文将带你了解IOS开发入门iOS开发中实现显示gif图片教程,希望本文对大家学IOS有所帮助。


          我们知道Gif是由一阵阵画面组成的,而且每一帧画面播放的时常可能会不相等,观察上面两个例子,发现他们都没有对Gif中每一帧的显示时常做处理,这样的结果就是整个Gif中每一帧画面都是以固定的速度向前播放,很显然这并不总会符合需求。

于是自己写一个解析Gif的工具类,解决每一帧画面并遵循每一帧所对应的显示时间进行播放。

程序的思路如下:

1、首先使用ImageIO库中的CGImageSource家在Gif文件。

2、通过CGImageSource获取到Gif文件中的总的帧数,以及每一帧的显示时间。

3、通过CAKeyframeAnimation来完成Gif动画的播放。

下面直接上我写的解析和播放Gif的工具类的代码:


   

//

 

//   SvGifView.h

 

//   SvGifSample

 

//

 

// Created   by maple on 3/28/13.

 

//   Copyright (c) 2013 smileEvday. All rights   reserved.

 

//

 

#import

 

@interface SvGifView : UIView

 

/*

 

*   @brief desingated initializer

 

*/

 

-   (id)initWithCenter:(CGPoint)center   fileURL:(NSURL*)fileURL;

 

/*

 

*   @brief start Gif Animation

 

*/

 

-   (void)startGif;

 

/*

 

*   @brief stop Gif Animation

 

*/

 

-   (void)stopGif;

 

/*

 

*   @brief get frames image(CGImageRef) in Gif

 

*/

 

+   (NSArray*)framesInGif:(NSURL*)fileURL;

 

@end

 

//

 

//   SvGifView.m

 

//   SvGifSample

 

//

 

//   Created by maple on 3/28/13.

 

//   Copyright (c) 2013 smileEvday. All rights   reserved.

 

//

 

#import "SvGifView.h"

 

#import

 

#import

 

/*

 

*   @brief resolving gif information

 

*/

 

void getFrameInfo(CFURLRef url, NSMutableArray *frames,   NSMutableArray *delayTimes, CGFloat *totalTime,CGFloat *gifWidth, CGFloat   *gifHeight)

 

{

 

CGImageSourceRef   gifSource = CGImageSourceCreateWithURL(url,   NULL);

 

// get frame   count

 

size_t frameCount =   CGImageSourceGetCount(gifSource);

 

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

 

//   get each frame

 

CGImageRef   frame = CGImageSourceCreateImageAtIndex(gifSource, i,   NULL);

 

[frames addObject:(id)frame];

 

CGImageRelease(frame);

 

// get gif info with each   frame

 

NSDictionary   *dict = (NSDictionary*)CGImageSourceCopyPropertiesAtIndex(gifSource, i,   NULL);

 

NSLog(@"kCGImagePropertyGIFDictionary   %@", [dict   valueForKey:(NSString*)kCGImagePropertyGIFDictionary]);

 

// get gif   size

 

if   (gifWidth != NULL &&   gifHeight != NULL) {

 

*gifWidth = [[dict   valueForKey:(NSString*)kCGImagePropertyPixelWidth]   floatValue];

 

*gifHeight = [[dict   valueForKey:(NSString*)kCGImagePropertyPixelHeight]   floatValue];

 

}

 

//   kCGImagePropertyGIFDictionary中kCGImagePropertyGIFDelayTime,kCGImagePropertyGIFUnclampedDelayTime值是一样的

 

NSDictionary   *gifDict = [dict   valueForKey:(NSString*)kCGImagePropertyGIFDictionary];

 

[delayTimes   addObject:[gifDict valueForKey:(NSString*)kCGImagePropertyGIFDelayTime]];

 

if (totalTime) {

 

*totalTime = *totalTime + [[gifDict   valueForKey:(NSString*)kCGImagePropertyGIFDelayTime]   floatValue];

 

}

 

}

 

}

 

@interface SvGifView() {

 

NSMutableArray *_frames;

 

NSMutableArray   *_frameDelayTimes;

 

CGFloat _totalTime; // seconds

 

CGFloat _width;

 

CGFloat _height;

 

}

 

@end

 

@implementation SvGifView

 

- (id)initWithCenter:(CGPoint)center   fileURL:(NSURL*)fileURL;

 

{

 

self   = [super   initWithFrame:CGRectZero];

 

if (self) {

 

_frames = [[NSMutableArray alloc]   init];

 

_frameDelayTimes = [[NSMutableArray alloc]   init];

 

_width =   0;

 

_height =   0;

 

if   (fileURL)   {

 

getFrameInfo((CFURLRef)fileURL, _frames, _frameDelayTimes,   &_totalTime, &_width,   &_height);

 

}

 

self.frame = CGRectMake(0,   0, _width,   _height);

 

self.center =   center;

 

}

 

return self;

 

}

 

+   (NSArray*)framesInGif:(NSURL *)fileURL

 

{

 

NSMutableArray *frames = [NSMutableArray   arrayWithCapacity:3];

 

NSMutableArray *delays = [NSMutableArray   arrayWithCapacity:3];

 

getFrameInfo((CFURLRef)fileURL, frames, delays, NULL, NULL,   NULL);

 

return frames;

 

}

 

-   (void)startGif

 

{

 

CAKeyframeAnimation *animation = [CAKeyframeAnimation   animationWithKeyPath:@"contents"];

 

NSMutableArray   *times = [NSMutableArray arrayWithCapacity:3];

 

CGFloat currentTime = 0;

 

int count =   _frameDelayTimes.count;

 

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

 

[times   addObject:[NSNumber numberWithFloat:(currentTime /   _totalTime)]];

 

<div class="l    

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved