1.UIWebView 播放(无法控制周期)
.h
@interface webViewController : UIViewController {
IBOutlet UIWebView *WebView;
IBOutlet UINavigationBar *Nav;
}
@property (nonatomic, retain) IBOutlet UIWebView *WebView;
@end
.m
- (void)viewDidLoad {
[super viewDidLoad];
[WebView setOpaque:NO];
[WebView setBackgroundColor:[UIColor clearColor]];
Nav.topItem.title=@"Welcome";
Nav.topItem.leftBarButtonItem=nil;
NSString* gifFileName = @"j_0002.gif";
NSMutableString* htmlStr = [NSMutableString string];
[htmlStr appendString:@"Hello Honey"];
[htmlStr appendString:@"<p><img src=\""];
[htmlStr appendFormat:@"%@",gifFileName];
[htmlStr appendString:@"\" alt=\"picture\"/>"];
[WebView loadHTMLString:htmlStr baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
}
2.glgif提供的开源代码实现(目前无法控制周期,需要自己再研究)
3.使用UIView的animation接口实现(GIF需要整理出每张图片)
动画可以用UIImageView,把动画的每一帧做成图片,转换成UIImage保存在animationImages数组中,调用- (void)startAnimating;就能看到动画
4.把GIF的通过GIF的格式转换成每张图片,通过UIView的animation的接口实现(GIF的格式貌似还是有问题,有部分图片的背景有问题)
- (NSMutableArray*)getImgArrayByName:(NSString*)name
{
//happybaby20
NSURL *threeUrl =[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"crad"
ofType:@"gif"]];
NSData* data = [[NSData alloc]initWithContentsOfURL:threeUrl];
NSMutableArray* array = nil;
// long word = ::SizeofResource(handle,hrsrc);
// char* lpBy = (char*)LoadResource(handle,hrsrc);
DWORD word = data.length;
BYTE* lpBy = (BYTE*)data.bytes;
//每张图保存的指针 需要释放
BYTE* pByte[100] = {0};
//每张图的大小
DWORD nu[100] = {0};
//图片数量
int num = 0;
DWORD firstLocation = 0;
for(DWORD j=0;j<word;j++)
{
if(lpBy[j]==0x2c)
{
if(lpBy[j-1]==0x00)
{
if(num==0)
{
firstLocation = j;
}
if (num== 10)
{
int sdf=nu[num];
int sdfadf=0;
}
PGifImage nowImage = (PGifImage)&lpBy[j+1];
if(nowImage->Flag.a==0)
{
DWORD number = 1+sizeof(GifImage);
while(lpBy[j+number]!=0)
{
number = number+(DWORD)lpBy[j+number]+1;
}
number++;
pByte[num] = new BYTE[number];
memset(pByte[num],0,number);
for(DWORD n=0;n<number;n++)
{
*(BYTE*)(pByte[num]+n) = lpBy[j+n];
}
nu[num] = number;
j = j+number-1;
num++;
}
else
{
//int number = 1+ sizeof(GifImage) + 3*(int)floor(pow(2.0f,nowImage->Flag.d));
DWORD number = 1+sizeof(GifImage)+1+3*(int)floor(pow(2.0f,nowImage->Flag.d));
while(lpBy[j+number] != 0)
{
number = number+lpBy[j+number];
}
pByte[num] = new BYTE[number];
memset(pByte[num],0,number);
for(int n=0;n<number;n++)
{
*(BYTE*)(pByte[num]+n) = lpBy[j+n];
}
nu[num] = number;
j = j+number-1;
num++;
}
}
}
}
NSArray *userPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [userPaths objectAtIndex:0];
//数量上
if (num>0)
{
array = [[NSMutableArray alloc] initWithCapacity:num];
}
for (int k=0; k<num; k++)
{
for(DWORD n=0;n<nu[k];n++)
{
lpBy[firstLocation+n] = *(BYTE*)(pByte[k]+n);
}
NSData* imgbuf = [[NSData alloc] initWithBytes:lpBy length:nu[k] + firstLocation];
if (imgbuf)
{
UIImage* img = [[UIImage alloc]initWithData:imgbuf];
NSData* imgdd = UIImagePNGRepresentation(img);
[imgdd writeToFile:[NSString stringWithFormat:@"%@/sdf%d.png",documentDirectory,k] atomically:NO];
if (img)
{
[array addObject:img];
}
[img release];
}
[imgbuf release];
delete pByte[k];
pByte[k] = NULL;
}
return array;
}
5.QuartzCore播放 比较完美的方案
#import <UIKit/UIKit.h>
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
@interface GifView : UIView {
CGImageSourceRef gif;
NSDictionary *gifProperties;
size_t index;
size_t count;
NSTimer *timer;
}
- (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath;
@end
.m
#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.05 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;
}
-(void)removeFromSuperview
{
NSLog(@"removeFromSuperview");
[timer invalidate];
timer = nil;
[super removeFromSuperview];
}
- (void)dealloc {
NSLog(@"dealloc");
CFRelease(gif);
[gifProperties release];
[super dealloc];
}
@end
DEMO
GifView *gifview = [[GifView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) filePath:[[NSBundle mainBundle] pathForResource:@"test.gif" ofType:nil]];
[self.view addSubview:gifview];