ios加載gif

Gif圖片是非常常見的圖片格式锈嫩,尤其是在聊天的過程中,Gif表情使用地很頻繁甥角。但是iOS竟然沒有現(xiàn)成的支持加載和播放Gif的類网严。

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

一蜈膨、加載本地Gif文件

1屿笼、使用UIWebView

// 讀取gif圖片數(shù)據(jù) 注意:傳入nil參數(shù)可能有警告NSData *data = [NSDatadataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"001"ofType:@"gif"]];? ? ? ? UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0,0,200,200)];? ? [webViewloadData:dataMIMEType:@"image/gif"textEncodingName:nilbaseURL:nil];? ? [self.viewaddSubview:webView];

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

2、將Gif拆分成多張圖片休雌,使用UIImageView播放

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

Loading.png

- (NSArray*)animationImages{NSFileManager*fielM = [NSFileManagerdefaultManager];NSString*path = [[NSBundlemainBundle] pathForResource:@"Loading"ofType:@"bundle"];NSArray*arrays = [fielM contentsOfDirectoryAtPath:path error:nil];NSMutableArray*imagesArr = [NSMutableArrayarray];for(NSString*nameinarrays) {UIImage*image = [UIImageimageNamed:[(@"Loading.bundle") stringByAppendingPathComponent:name]];if(image) {? ? ? ? ? ? [imagesArr addObject:image];? ? ? ? }? ? }returnimagesArr;}- (void)viewDidLoad {? ? [superviewDidLoad];UIImageView*gifImageView = [[UIImageViewalloc] initWithFrame:frame];? ? gifImageView.animationImages = [selfanimationImages];//獲取Gif圖片列表gifImageView.animationDuration =5;//執(zhí)行一次完整動(dòng)畫所需的時(shí)長(zhǎng)gifImageView.animationRepeatCount =1;//動(dòng)畫重復(fù)次數(shù)[gifImageView startAnimating];? ? [self.view addSubview:gifImageView];}

3灶壶、使用SDWebImage

但是很遺憾,SDWebImagesd_setImageWithURL:placeholderImage:這個(gè)方法是不能播放本地Gif的杈曲,它只能顯示Gif的第一張圖片而已驰凛。So,此方法行不通

UIImageView *gifImageView = [[UIImageView alloc]initWithFrame:frame];? ? [gifImageViewsd_setImageWithURL:nilplaceholderImage:[UIImageimageNamed:@"gifTest.gif"]];

其實(shí)担扑,在SDWebImage這個(gè)庫里有一個(gè)UIImage+GIF的類別恰响,里面為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 = [[NSBundlemainBundle] pathForResource:@"gifTest"ofType:@"gif"];NSData*data = [NSDatadataWithContentsOfFile:path];UIImage*image = [UIImagesd_animatedGIFWithData:data];? ? gifImageView.image = image;

然后通過斷點(diǎn),我們看下獲取到的image是個(gè)什么樣的東東:

img.png

我們發(fā)現(xiàn):

image的isa指針指向了_UIAnimatedImage枢劝,說明它是一個(gè)叫作_UIAnimatedImage的類(當(dāng)然井联,這個(gè)_UIAnimatedImage蘋果是不會(huì)直接讓我們使用的)

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

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

其實(shí),動(dòng)畫執(zhí)續(xù)時(shí)間_duration也可以更改您旁!

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

+ (UIImage*)sd_animatedGIFWithData:(NSData*)data {if(!data) {returnnil;? ? }CGImageSourceRefsource =CGImageSourceCreateWithData((__bridgeCFDataRef)data,NULL);? ? size_t count =CGImageSourceGetCount(source);UIImage*animatedImage;if(count <=1) {? ? ? ? animatedImage = [[UIImagealloc] initWithData:data];? ? }else{NSMutableArray*images = [NSMutableArrayarray];NSTimeIntervalduration =0.0f;for(size_t i =0; i < count; i++) {CGImageRefimage =CGImageSourceCreateImageAtIndex(source, i,NULL);? ? ? ? ? ? duration += [selfsd_frameDurationAtIndex:i source:source];? ? ? ? ? ? [images addObject:[UIImageimageWithCGImage:image scale:[UIScreenmainScreen].scale orientation:UIImageOrientationUp]];CGImageRelease(image);? ? ? ? }if(!duration) {? ? ? ? ? ? duration = (1.0f /10.0f) * count;? ? ? ? }? ? ? ? animatedImage = [UIImageanimatedImageWithImages:images duration:duration];? ? }CFRelease(source);returnanimatedImage;}

很明顯烙常,duration是可以隨意更改的,只不過此方法設(shè)置了一個(gè)默認(rèn)值

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

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

UIImage *animatedImage = [UIImageanimatedImageWithImages:imagesduration:duration];

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

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

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

1率触、SDWebImage根據(jù)url將Gif文件下載下來终议,格式為一個(gè)NSData

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

3穴张、通過上面的方法二即可顯示出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文件

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渔欢,一起剝皮案震驚了整個(gè)濱河市墓塌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奥额,老刑警劉巖苫幢,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異垫挨,居然都是意外死亡韩肝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門九榔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哀峻,“玉大人涡相,你說我怎么就攤上這事∶战耄” “怎么了漾峡?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)喻旷。 經(jīng)常有香客問我生逸,道長(zhǎng),這世上最難降的妖魔是什么且预? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任槽袄,我火速辦了婚禮,結(jié)果婚禮上锋谐,老公的妹妹穿的比我還像新娘遍尺。我一直安慰自己,他們只是感情好涮拗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布乾戏。 她就那樣靜靜地躺著,像睡著了一般三热。 火紅的嫁衣襯著肌膚如雪鼓择。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天就漾,我揣著相機(jī)與錄音呐能,去河邊找鬼。 笑死抑堡,一個(gè)胖子當(dāng)著我的面吹牛摆出,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播首妖,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼偎漫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了有缆?” 一聲冷哼從身側(cè)響起骑丸,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妒貌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铸豁,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灌曙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了节芥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片在刺。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逆害,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚣驼,到底是詐尸還是另有隱情魄幕,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布颖杏,位于F島的核電站纯陨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏留储。R本人自食惡果不足惜翼抠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望获讳。 院中可真熱鬧阴颖,春花似錦、人聲如沸丐膝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帅矗。三九已至偎肃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間损晤,已是汗流浹背软棺。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尤勋,地道東北人喘落。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像最冰,于是被迫代替她去往敵國(guó)和親瘦棋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • Gif圖片是非常常見的圖片格式暖哨,尤其是在聊天的過程中赌朋,Gif表情使用地很頻繁。但是iOS竟然沒有現(xiàn)成的支持加載和播...
    weicyNO_1閱讀 1,793評(píng)論 0 0
  • Gif圖片是非常常見的圖片格式篇裁,尤其是在聊天的過程中沛慢,Gif表情使用地很頻繁。但是iOS竟然沒有現(xiàn)成的支持加載和播...
    iOS_大菜鳥閱讀 3,004評(píng)論 1 5
  • 1.系統(tǒng)UIImageView 多張圖片組成動(dòng)畫 /** * UIImageView 動(dòng)畫 * Memor...
    zhengelababy閱讀 8,791評(píng)論 3 6
  • 1.WebView UIWebView WKWebView WKWebView實(shí)習(xí)和UIWebView一樣,也是將...
    壯骨閱讀 4,779評(píng)論 2 6
  • 1. 原生方法: UIWebView特點(diǎn):加載速度略長(zhǎng),性能更優(yōu)达布,播放的gif動(dòng)態(tài)圖更加流暢团甲。 UIImagVie...
    奮斗的蝸牛閱讀 4,369評(píng)論 1 1