iOS----使用UIImageView播放GIF

大家好,好久沒(méi)有跟新了。其實(shí)也就昨天到今天的時(shí)間。

前言:實(shí)際上,GIF動(dòng)圖文件中包含了一組圖片及其信息數(shù)組,這些信息數(shù)據(jù)記錄著這一組圖片中各張圖片的播放時(shí)長(zhǎng)等信息,我們可以將圖片和這些信息或取出來(lái),使用UIImageView的幀動(dòng)畫(huà)技術(shù)進(jìn)行動(dòng)畫(huà)播放。

好了不多說(shuō)了 ?開(kāi)始上代碼吧:

首先自己找一個(gè)GIF圖吧,拖到工程里面。

- (void)createGIF {

UIImageView*imageView = [[UIImageViewalloc]initWithFrame:CGRectMake(20,100,280,200)];

[self.viewaddSubview:imageView];

//1.找到gif文件路徑

NSString*dataPath = [[NSBundlemainBundle]pathForResource:@"11"ofType:@"gif"];

//2.獲取gif文件數(shù)據(jù)

CGImageSourceRefsource =CGImageSourceCreateWithURL((CFURLRef)[NSURLfileURLWithPath:dataPath],NULL);

//3.獲取gif文件中圖片的個(gè)數(shù)

size_tcount =CGImageSourceGetCount(source);

//4.定義一個(gè)變量記錄gif播放一輪的時(shí)間

floatallTime =0;

//5.定義一個(gè)可變數(shù)組存放所有圖片

NSMutableArray*imageArray = [[NSMutableArrayalloc]init];

//6.定義一個(gè)可變數(shù)組存放每一幀播放的時(shí)間

NSMutableArray*timeArray = [[NSMutableArrayalloc]init];

//7.每張圖片的寬度

NSMutableArray*widthArray = [[NSMutableArrayalloc]init];

//8.每張圖片的高度

NSMutableArray*heightArray = [[NSMutableArrayalloc]init];

//遍歷gif

for(size_ti=0; i

CGImageRefimage =CGImageSourceCreateImageAtIndex(source, i,NULL);

[imageArrayaddObject:(__bridgeUIImage*)(image)];

CGImageRelease(image);

//獲取圖片信息

NSDictionary*info = (__bridgeNSDictionary*)CGImageSourceCopyPropertiesAtIndex(source, i,NULL);

NSLog(@"info---%@",info);

//獲取寬度

CGFloatwidth = [[infoobjectForKey:(__bridgeNSString*)kCGImagePropertyPixelWidth]floatValue];

//獲取高度

CGFloatheight = [[infoobjectForKey:(__bridgeNSString*)kCGImagePropertyPixelHeight]floatValue];

//

[widthArrayaddObject:[NSNumbernumberWithFloat:width]];

[heightArrayaddObject:[NSNumbernumberWithFloat:height]];

//統(tǒng)計(jì)時(shí)間

NSDictionary*timeDic = [infoobjectForKey:(__bridgeNSString*)kCGImagePropertyGIFDictionary];

CGFloattime = [[timeDicobjectForKey:(__bridgeNSString*)kCGImagePropertyGIFDelayTime]floatValue];

[timeArrayaddObject:[NSNumbernumberWithFloat:time]];

}

//添加幀動(dòng)畫(huà)

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

NSMutableArray*times = [[NSMutableArrayalloc]init];

floatcurrentTime =0;

//設(shè)置每一幀的時(shí)間占比

for(inti=0; i

[timesaddObject:[NSNumbernumberWithFloat:currentTime/allTime]];

currentTime +=[timeArray[i]floatValue];

}

[animationsetKeyTimes:times];

[animationsetValues:imageArray];

[animationsetTimingFunction:[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionLinear]];

//設(shè)置循環(huán)

animation.repeatCount=MAXFLOAT;

//設(shè)置播放總時(shí)長(zhǎng)

animation.duration= allTime*MAXFLOAT;

//Layer層添加

[[imageViewlayer]addAnimation:animationforKey:@"gifAnimation"];

}

這個(gè)是源代碼:

下面是我打印出來(lái)的信息:

好了,今天就到這里了,謝謝大家的支持。我的博客地址:www.cnblogs.com/PengHongMiao

另外附上GitHub地址:https://github.com/PengHongMiao

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、引言 在iOS開(kāi)發(fā)中,UIImageView類(lèi)專(zhuān)門(mén)來(lái)負(fù)責(zé)圖片數(shù)據(jù)的渲染,并且UIImageView也有幀動(dòng)畫(huà)的...
    小貓仔閱讀 2,110評(píng)論 0 2
  • 1.系統(tǒng)UIImageView 多張圖片組成動(dòng)畫(huà) /** * UIImageView 動(dòng)畫(huà) * Memor...
    zhengelababy閱讀 8,934評(píng)論 3 6
  • 1. 原生方法: UIWebView特點(diǎn):加載速度略長(zhǎng),性能更優(yōu),播放的gif動(dòng)態(tài)圖更加流暢。 UIImagVie...
    奮斗的蝸牛閱讀 4,393評(píng)論 1 1
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫(huà)全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,572評(píng)論 6 30
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,420評(píng)論 25 708