iOS 播放Gif动画

//

//  loadGifView.h

//  PlayGif

//

//  Created by 寒竹子 on 15/4/27.

//  Copyright (c) 2015年 寒竹子. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface loadGifView : UIView

/**

*  @brief 初始化

*

*  @return

*/

- (instancetype)initWithFrame:(CGRect)frame localFileURL:(NSURL *)fileURL;

/**

*  @brief 开始gif动画

*

*  @return

*/

- (void)startGifAnimation;

/**

*  @brief 停止gif动画

*

*  @return

*/

- (void)stopGifAnimation;

/**

*  @brief 得到gif中所有的图片的frame

*

*  @return

*/

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

@end

//

//  loadGifView.m

//  PlayGif

//

//  Created by 寒竹子 on 15/4/27.

//  Copyright (c) 2015年 寒竹子. All rights reserved.

//  播放gif

#import "loadGifView.h"

#import <ImageIO/ImageIO.h>

#import <QuartzCore/CoreAnimation.h>

@interface loadGifView ()

@property (nonatomic, strong) NSMutableArray * frames;

@property (nonatomic, strong) NSMutableArray * frameDelayTimes;

@property (nonatomic, assign) CGFloat totalTime;

@property (nonatomic, assign) CGFloat width;

@property (nonatomic, assign) CGFloat height;

@end

@implementation loadGifView

/**

* @brief  得到gif图片的信息

*

* @param

* @return

*/

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:(__bridge id)frame];

CGImageRelease(frame);

// get gif info with each frame

NSDictionary *dict = (NSDictionary*)CFBridgingRelease(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];

}

CFRelease(CFBridgingRetain(dict));

}

if (gifSource) {

CFRelease(gifSource);

}

}

- (instancetype)initWithFrame:(CGRect)frame localFileURL:(NSURL *)fileURL

{

self = [super initWithFrame:frame];

if (self) {

_frames = [[NSMutableArray alloc] init];

_frameDelayTimes = [[NSMutableArray alloc] init];

_width = 0;

_height = 0;

if (fileURL) {

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

}

}

return self;

}

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

{

NSMutableArray *frames = [NSMutableArray arrayWithCapacity:3];

NSMutableArray *delays = [NSMutableArray arrayWithCapacity:3];

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

return frames;

}

- (void)startGifAnimation

{

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

NSMutableArray *times = [NSMutableArray arrayWithCapacity:3];

CGFloat currentTime = 0;

int count = (int)_frameDelayTimes.count;

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

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

currentTime += [[_frameDelayTimes objectAtIndex:i] floatValue];

}

[animation setKeyTimes:times];

NSMutableArray *images = [NSMutableArray arrayWithCapacity:3];

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

[images addObject:[_frames objectAtIndex:i]];

}

[animation setValues:images];

[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];

animation.duration = _totalTime;

animation.delegate = self;

animation.repeatCount = MAXFLOAT;

[self.layer addAnimation:animation forKey:@"gifAnimation"];

}

- (void)stopGifAnimation

{

[self.layer removeAllAnimations];

}

@end

//

//  PlayGifViewController.h

//  PlayGif

//

//  Created by 寒竹子 on 15/4/27.

//  Copyright (c) 2015年 寒竹子. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface PlayGifViewController : UIViewController

@end

//

//  PlayGifViewController.m

//  PlayGif

//

//  Created by 寒竹子 on 15/4/27.

//  Copyright (c) 2015年 寒竹子. All rights reserved.

//

#import "PlayGifViewController.h"

#import "loadGifView.h"

@interface PlayGifViewController ()

@property (nonatomic, strong) NSArray * imageArr;

@end

@implementation PlayGifViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor blackColor];

// 播放gif动画

NSString * path = [[NSBundle mainBundle] pathForResource:@"2.gif" ofType:nil];

loadGifView * gifView = [[loadGifView alloc] initWithFrame:CGRectMake(([UIScreen mainScreen].bounds.size.width - 200) / 2.0f, 100, 200, 300) localFileURL:[NSURL fileURLWithPath:path]];

[gifView startGifAnimation];

[self.view addSubview:gifView];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

@end

时间: 04-27

iOS 播放Gif动画的相关文章

iOS中Animation 动画 UI_22

1.iOS中我们能看到的控件都是UIView的子类,比如UIButton UILabel UITextField UIImageView等等 2.UIView能够在屏幕的显示是因为在创建它的时候内部自动添加一个CALayer图层,通过这个图层在屏幕上显示的时候会调用一个drawRect: 的方法,完成绘图,才能在屏幕上显示 3.CALayer 本身就具有显示功能,但是它不能响应用户的交互事件,如果只是单纯的显示一个图形,此时你可以使用CALayer创建或者是使用UIView创建,但是如果这个图形

iOS 播放gif动态图的方式探讨

原文链接:http://my.oschina.net/u/2340880/blog/608560 摘要iOS中没有现成的接口来展示gif动态图,但可以通过其他的方式来处理gif图的展示.iOS中播放gif动态图的方式探讨 一.引言 在iOS开发中,UIImageView类专门来负责图片数据的渲染,并且UIImageView也有帧动画的方法来播放一组图片,但是对于gif类型的数据,UIImageView中并没有现成的接口提供给开发者使用,在iOS中一般可以通过两种方式来播放gif动态图,一种方式是

IOS 播放视频 MPMoviePlayerController

在unity游戏的开头播放视频 , 根据需求 , 最后决定用 MPMoviePlayerController 来实现播放, 实现如下: by Tin 需要在AppController.mm的 OpenEAGL_UnityCallback  修改下view的大小 UIView *mainView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; // mainView.backgroundColor

iOS开发系列-动画绘图CALayer

代码下载地址:https://github.com/wwpeter/WW-MotionDemo.git 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单:

[Swift通天遁地]八、媒体与动画-(10)在项目中播放GIF动画

本文将演示使用第三方类库播放GIF动画. 首先确保已经安装了所需的第三方类库.双击查看安装配置文件[Podfile] 1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'SwiftGifOrigin', '~> 1.6.1' 7 end 根据配置文件中的相关设置,安装第三方类库. 安装完成之后,双击打开项

iOS关于CoreAnimation动画知识总结

一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了:UIKit动画有两种写法:它不仅可以针对视图还可以针对其它控件: 1:第一种写法是利用属性,结合beginAnimations.commitAnimations -(void)animationOfUIKit { UIView *redView=[[UIView alloc]initWithFram

cocos2d 播放GIF动画类

cocos2d 播放GIF动画类 以前项目中曾经用到过,后来因为GIF图像的质量较差,被弃用了,把公司名字去掉分享下,根据网上资料改编的cocos2d-iphone版的. // // CCSpriteGif.h // // Created by Yuming on 13-1-23. // Copyright 2013年 __MyCompanyName__. All rights reserved. // // 本类需要导入ImageIO.framework #import <Foundation

android 拓展ImageView播放GIF动画

原生Android控件ImageView并不能支持播放GiF格式的图片.如果将一张GIF的图片放入ImageView中,它只会显示图片的第一帧,不会产生任何动画效果. Android中播放GIF动画实现方法还是用多种的,最常用的就是使用   Frame动画, 但局限性较多,所以下面用一种拓展的ImageView实现效果. 1.要用到自定义控件,就要使用自定义控件的属性,因此需要在values下新建一个attrs.xml,可以为这个文件中添加任何需要自定义的属性. 这里只需要一个auto_play

IOS中实现动画的几种方式

1.UIView首末式动画(实现渐变效果) [UIView animateWithDuration:...] 在修改了自动布局的约束之后,执行下面代码实现动画效果 [UIView animateWithDuration:1.0 animations:^{ [添加了约束的view layoutIfNeeded]; }]; 2.UIImageView的startAnimating系列方法播放帧动画. 3.当对非Root Layer的部分属性(可动画属性)进行修改时,默认会自动产生一些动画效果(隐式动