一
view = [[UIView
alloc] initWithFrame:CGRectMake(0,
0, 100,
100)];
NSString *imagePath =[[NSBundle
mainBundle] pathForResource:@"csjg"
ofType:@"gif"];
CGImageSourceRef cImageSource = CGImageSourceCreateWithURL((__bridge
CFURLRef)[NSURL
fileURLWithPath:imagePath],
NULL);
size_t imageCount = CGImageSourceGetCount(cImageSource);
NSMutableArray *images = [[NSMutableArray
alloc] initWithCapacity:imageCount];
NSMutableArray *times = [[NSMutableArray
alloc] initWithCapacity:imageCount];
NSMutableArray *keyTimes = [[NSMutableArray
alloc] initWithCapacity:imageCount];
float totalTime = 0;
for (size_t i =
0; i < imageCount; i++) {
CGImageRef cgimage= CGImageSourceCreateImageAtIndex(cImageSource, i,
NULL);
[images
addObject:(__bridge
id)cgimage];
CGImageRelease(cgimage);
NSDictionary *properties = (__bridge
NSDictionary *)CGImageSourceCopyPropertiesAtIndex(cImageSource, i,
NULL);
NSDictionary *gifProperties = [properties
valueForKey:(__bridge
NSString *)kCGImagePropertyGIFDictionary];
NSString *gifDelayTime = [gifProperties valueForKey:(__bridge
NSString* )kCGImagePropertyGIFDelayTime];
[times
addObject:gifDelayTime];
totalTime += [gifDelayTime
floatValue];
// _size.width = [[properties valueForKey:(NSString*)kCGImagePropertyPixelWidth] floatValue];
// _size.height = [[properties valueForKey:(NSString*)kCGImagePropertyPixelHeight] floatValue];
}
float currentTime = 0;
for (size_t i =
0; i < times.count; i++) {
float keyTime = currentTime / totalTime;
[keyTimes
addObject:[NSNumber
numberWithFloat:keyTime]];
currentTime += [[times
objectAtIndex:i] floatValue];
}
CAKeyframeAnimation *animation = [CAKeyframeAnimation
animationWithKeyPath:@"contents"];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear]];
[animation
setValues:images];
[animation
setKeyTimes:keyTimes];
animation.duration = totalTime;
animation.repeatCount =
HUGE_VALF;
[view.layer
addAnimation:animation
forKey:@"gifAnimation"];
二
//
// GifView.h
// GIFViewer
//
// Created by xToucher04 on 11-11-9.
// Copyright 2011 Toucher. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <ImageIO/ImageIO.h>
@interface GifView :
UIView {
CGImageSourceRef gif;
NSDictionary *gifProperties;
size_t index;
size_t count;
NSTimer *timer;
}
- (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath;
- (id)initWithFrame:(CGRect)frame data:(NSData *)_data;
@end
//
// GifView.m
// GIFViewer
//
// Created by xToucher04 on 11-11-9.
// Copyright 2011 Toucher. All rights reserved.
//
#import "GifView.h"
#import <QuartzCore/QuartzCore.h>
@implementation GifView
- (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath{
self = [super
initWithFrame:frame];
if (self) {
gifProperties = [[NSDictionary
dictionaryWithObject:[NSDictionary
dictionaryWithObject:[NSNumber
numberWithInt:0]
forKey:(NSString *)kCGImagePropertyGIFLoopCount]
forKey:(NSString *)kCGImagePropertyGIFDictionary]
retain];
gif =
CGImageSourceCreateWithURL((CFURLRef)[NSURL
fileURLWithPath:_filePath], (CFDictionaryRef)gifProperties);
count =CGImageSourceGetCount(gif);
timer = [NSTimer
scheduledTimerWithTimeInterval:0.12
target:self
selector:@selector(play)
userInfo:nil
repeats:YES];
[timer
fire];
}
return
self;
}
- (id)initWithFrame:(CGRect)frame data:(NSData *)_data{
self = [super
initWithFrame:frame];
if (self) {
gifProperties = [[NSDictionary
dictionaryWithObject:[NSDictionary
dictionaryWithObject:[NSNumber
numberWithInt:0]
forKey:(NSString *)kCGImagePropertyGIFLoopCount]
forKey:(NSString *)kCGImagePropertyGIFDictionary]
retain];
//
gif = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:_filePath], (CFDictionaryRef)gifProperties);
gif =
CGImageSourceCreateWithData((CFDataRef)_data, (CFDictionaryRef)gifProperties);
count =CGImageSourceGetCount(gif);
timer = [NSTimer
scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(play)
userInfo:nil
repeats:YES];
[timer
fire];
}
return
self;
}
-(void)play
{
index ++;
index =
index%count;
CGImageRef ref =
CGImageSourceCreateImageAtIndex(gif,
index, (CFDictionaryRef)gifProperties);
self.layer.contents = (id)ref;
CFRelease(ref);
}
-(void)removeFromSuperview
{
NSLog(@"removeFromSuperview");
[timer
invalidate];
timer =
nil;
[super
removeFromSuperview];
}
- (void)dealloc {
NSLog(@"dealloc");
CFRelease(gif);
[gifProperties
release];
[super
dealloc];
}
@end
使用的时候:
GifView *pathView =[[GifView
alloc] initWithFrame:CGRectMake(100,
0, 100,
100)
filePath:[[NSBundle
mainBundle] pathForResource:@"csjg"
ofType:@"gif"]];