iOS加載Gif圖片

Gif圖片是非常常見(jiàn)的圖片格式蛔溃,尤其是在聊天的過(guò)程中,Gif表情使用地很頻繁瓦宜。但是iOS竟然沒(méi)有現(xiàn)成的支持加載和播放Gif的類(lèi)蔚万。

簡(jiǎn)單地匯總了一下,大概有以下幾種方法:

1临庇、使用UIWebView,但是這種方法比較耗內(nèi)存反璃。

//讀取gif圖片數(shù)據(jù)UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,200,200)];

[self.view addSubview:webView];

NSString*path = [[NSBundle mainBundle] pathForResource:@"001"ofType:@"gif"];/*NSData *data = [NSData dataWithContentsOfFile:path];

使用loadData:MIMEType:textEncodingName: 則有警告

[webView loadData:data MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];*/NSURL*url =[NSURL URLWithString:path];

[webView loadRequest:[NSURLRequest requestWithURL:url]];

但是使用UIWebView的弊端在于,不能設(shè)置Gif動(dòng)畫(huà)的播放時(shí)間苔巨。

2版扩、將Gif拆分成多張圖片废离,使用UIImageView播放侄泽。

最好把所需要的Gif圖片打包到Bundle文件內(nèi),如下圖所示

Loading.png

- (NSArray *)animationImages

{

NSFileManager*fielM =[NSFileManager defaultManager];

NSString*path = [[NSBundle mainBundle] pathForResource:@"Loading"ofType:@"bundle"];

NSArray*arrays =[fielM contentsOfDirectoryAtPath:path error:nil];

NSMutableArray*imagesArr =[NSMutableArray array];for(NSString *nameinarrays) {

UIImage*image = [UIImage imageNamed:[(@"Loading.bundle") stringByAppendingPathComponent:name]];if(image) {

[imagesArr addObject:image];

}

}returnimagesArr;

}- (void)viewDidLoad {

[super viewDidLoad];

UIImageView*gifImageView =[[UIImageView alloc] initWithFrame:frame];

gifImageView.animationImages= [self animationImages];//獲取Gif圖片列表gifImageView.animationDuration =5;//執(zhí)行一次完整動(dòng)畫(huà)所需的時(shí)長(zhǎng)gifImageView.animationRepeatCount =0;//動(dòng)畫(huà)重復(fù)次數(shù)[gifImageView startAnimating];

[self.view addSubview:gifImageView];

}

補(bǔ)充:可以直接取出動(dòng)態(tài)image。需要吧圖片設(shè)置進(jìn)去蜻韭。從零開(kāi)始悼尾。

UIImage *image = [UIImage animatedImageNamed:@"youhuiquanxiao"duration:2];

3、使用SDWebImage

但是很遺憾肖方,SDWebImage 的 sd_setImageWithURL:placeholderImage:這個(gè)方法是不能播放本地Gif的闺魏,它只能顯示Gif的第一張圖片而已。So俯画,此方法行不通

// 行不通

UIImageView *gifImageView =[[UIImageView alloc] initWithFrame:frame];

[gifImageView sd_setImageWithURL:nil placeholderImage:[UIImage imageNamed:@"gifTest.gif"]];

其實(shí)析桥,在SDWebImage這個(gè)庫(kù)里有一個(gè)UIImage+GIF的類(lèi)別,里面為UIImage擴(kuò)展了三個(gè)方法:

@interfaceUIImage (GIF)+ (IImage *)sd_animatedGIFNamed:(NSString *)name;+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size;@end

大家一看就知道艰垂,我們要獲取處理后的Gif圖片泡仗,其實(shí)只要調(diào)用前面兩個(gè)中的其中一個(gè)方法就行了

注意:第一個(gè)只需要傳Gif的名字,而不需要帶擴(kuò)展名(如Gif圖片名字為001@2x.gif猜憎,只需傳001即可)

我們就使用第二個(gè)方法試一試效果:

NSString *path = [[NSBundle mainBundle] pathForResource:@"gifTest"ofType:@"gif"];

NSData*data =[NSData dataWithContentsOfFile:path];

UIImage*image =[UIImage sd_animatedGIFWithData:data];

gifImageView.image= image;

然后通過(guò)斷點(diǎn)娩怎,我們發(fā)現(xiàn):

image的isa指針指向了_UIAnimatedImage ,說(shuō)明它是一個(gè)叫作_UIAnimatedImage 的類(lèi)(當(dāng)然胰柑,這個(gè)_UIAnimatedImage 蘋(píng)果是不會(huì)直接讓我們使用的)

_images 表示:這個(gè)Gif包含了多少?gòu)垐D片

_duration表示:執(zhí)行一次完整動(dòng)畫(huà)所需的時(shí)長(zhǎng)

其實(shí)截亦,動(dòng)畫(huà)執(zhí)續(xù)時(shí)間_duration也可以更改爬泥!

我們來(lái)看下此方法的內(nèi)部實(shí)現(xiàn):

+ (UIImage *)sd_animatedGIFWithData:(NSData *)data {if(!data) {returnnil;

}

CGImageSourceRef source=CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

size_t count=CGImageSourceGetCount(source);

UIImage*animatedImage;if(count <=1) {

animatedImage=[[UIImage alloc] initWithData:data];

}else{

NSMutableArray*images =[NSMutableArray array];

NSTimeInterval duration=0.0f;for(size_t i =0; i < count; i++) {

CGImageRef image=CGImageSourceCreateImageAtIndex(source, i, NULL);

duration+=[self sd_frameDurationAtIndex:i source:source];

[images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];

CGImageRelease(image);

}if(!duration) {

duration= (1.0f/10.0f) *count;

}

animatedImage=[UIImage animatedImageWithImages:images duration:duration];

}

CFRelease(source);returnanimatedImage;

}

很明顯,duration是可以隨意更改的崩瓤,只不過(guò)此方法設(shè)置了一個(gè)默認(rèn)值(duration = (1.0f / 10.0f) * count)

歸根到底袍啡,創(chuàng)建新的動(dòng)態(tài)的Image其實(shí)是調(diào)用了系統(tǒng)提供的一個(gè)UIImage的類(lèi)方法而已:

UIImage *animatedImage = [UIImage animatedImageWithImages:images duration:duration];

二、加載網(wǎng)絡(luò)Gif文件

加載網(wǎng)絡(luò)的Gif文件就簡(jiǎn)單多了谷遂。最簡(jiǎn)單的方法葬馋,我們只需要使用SDWebImage 的 sd_setImageWithURL:這個(gè)方法傳入Gif文件是url地址即可。

糾其原因:稍微仔細(xì)看了SDWebImage內(nèi)部實(shí)現(xiàn)就可以清楚肾扰,大概是以下幾個(gè)步驟:

1畴嘶、SDWebImage根據(jù)url將Gif文件下載下來(lái),格式為一個(gè)NSData

2集晚、如果判斷是Gif格式窗悯,則會(huì)調(diào)用** sd_animatedGIFWithData:** 將Data轉(zhuǎn)換成我們需要的Gif格式

3、通過(guò)上面的方法二即可顯示出Gif圖片

UIImage *image =[UIImage sd_animatedGIFWithData:data];

gifImageView.image= image;

總結(jié)

一偷拔、加載本地Gif文件

1蒋院、使用UIWebView不可以設(shè)置duration,其他兩種方法都可設(shè)置莲绰。而且方法1的容器為UIWebView 欺旧,其余兩種的容器都是大家熟悉的UIImageView

2、方法2和方法3需要對(duì)應(yīng)看應(yīng)用場(chǎng)景

如:下拉蛤签、上拉加載控件需要一個(gè)根據(jù)拉動(dòng)距離設(shè)置特定的Image辞友,則需要使用方法2

直接顯示Gif圖片,則使用方法3會(huì)更方便

二震肮、加載網(wǎng)絡(luò)Gif文件

直接使用SDWebImage 的 sd_setImageWithURL:這個(gè)方法傳入Gif文件是url地址即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末称龙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子戳晌,更是在濱河造成了極大的恐慌鲫尊,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沦偎,死亡現(xiàn)場(chǎng)離奇詭異疫向,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)豪嚎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)搔驼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人疙渣,你說(shuō)我怎么就攤上這事匙奴。” “怎么了妄荔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵泼菌,是天一觀的道長(zhǎng)谍肤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哗伯,這世上最難降的妖魔是什么荒揣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮焊刹,結(jié)果婚禮上系任,老公的妹妹穿的比我還像新娘。我一直安慰自己虐块,他們只是感情好俩滥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贺奠,像睡著了一般霜旧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儡率,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天挂据,我揣著相機(jī)與錄音,去河邊找鬼儿普。 笑死崎逃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眉孩。 我是一名探鬼主播个绍,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勺像!你這毒婦竟也來(lái)了障贸?” 一聲冷哼從身側(cè)響起错森,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吟宦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后涩维,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體殃姓,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年瓦阐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜗侈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睡蟋,死狀恐怖踏幻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戳杀,我是刑警寧澤该面,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布夭苗,位于F島的核電站,受9級(jí)特大地震影響隔缀,放射性物質(zhì)發(fā)生泄漏题造。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一猾瘸、第九天 我趴在偏房一處隱蔽的房頂上張望界赔。 院中可真熱鬧,春花似錦牵触、人聲如沸淮悼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敛惊。三九已至,卻和暖如春绰更,著一層夾襖步出監(jiān)牢的瞬間瞧挤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工儡湾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留特恬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓徐钠,卻偏偏與公主長(zhǎng)得像癌刽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尝丐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • Gif圖片是非常常見(jiàn)的圖片格式显拜,尤其是在聊天的過(guò)程中,Gif表情使用地很頻繁爹袁。但是iOS竟然沒(méi)有現(xiàn)成的支持加載和播...
    iOS_大菜鳥(niǎo)閱讀 3,003評(píng)論 1 5
  • 1.系統(tǒng)UIImageView 多張圖片組成動(dòng)畫(huà) /** * UIImageView 動(dòng)畫(huà) * Memor...
    zhengelababy閱讀 8,790評(píng)論 3 6
  • 1. 原生方法: UIWebView特點(diǎn):加載速度略長(zhǎng),性能更優(yōu)远荠,播放的gif動(dòng)態(tài)圖更加流暢。 UIImagVie...
    奮斗的蝸牛閱讀 4,369評(píng)論 1 1
  • 1失息、通過(guò)拆分gif譬淳,加載一個(gè)圖片數(shù)組(推薦一個(gè)Mac APP自動(dòng)拆分gif:Gif Preview) 2、UIWe...
    薄涼_簡(jiǎn)書(shū)閱讀 548評(píng)論 0 1
  • Gif圖片是非常常見(jiàn)的圖片格式盹兢,尤其是在聊天的過(guò)程中邻梆,Gif表情使用地很頻繁。但是iOS竟然沒(méi)有現(xiàn)成的支持加載和播...
    CoderSC閱讀 2,443評(píng)論 0 0