iOS中加載Gif圖的正確姿勢

昨天無意中看到一個(gè)帖子,寫如何加載gif圖的,感覺好麻煩的樣子,本來很簡單的一件事,為什么搞的這么復(fù)雜呢?

的確,App上有的地方能夠顯示一些動(dòng)態(tài)圖(gif圖)那對用戶體驗(yàn)來說可是極好的,絕對是App的加分亮點(diǎn),逼格立馬上了好幾個(gè)臺階

But

我們都知道iOS中顯示圖片的控件是UIImageView,但是UIImageView不支持.gif格式的圖片,那么怎么才能正確的加載一個(gè)gif圖呢?

其實(shí),仔細(xì)想想,除了UIImageView可以加載圖片之外,就沒有別的系統(tǒng)控件了么?仔細(xì)想想,當(dāng)然有!!

UIWebView

用WebView

UIWebView有這么一個(gè)方法:

- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;

data就是要加載的二進(jìn)制數(shù)據(jù)(NSData),我們要加載gif圖,就需要先把圖片轉(zhuǎn)換成NSData類型

MIME(Multipurpose Internet Mail Extensions)[1]多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型。在MIME 參考手冊中我們可以查到,我們需要的類型是image/gif

編碼格式UTF-8

Url這里就不需要了

那么借助UIWebView的這個(gè)方法就可以加載gif格式的圖片了,基本思路就是:

創(chuàng)建一個(gè)類(GifImageView)繼承自UIView,在GifImageView中創(chuàng)建一個(gè)UIWebView加載gif圖,這樣一來,加載gif就像加載一個(gè)UIView那么easy了

代碼

GifImageView.h

#import

@interface GifImageView : UIView

- (id)initWithFrame:(CGRect)frame GifImageName:(NSString*)gitImageName;

@end

GifImageView.m

#import "GifImageView.h"

@implementation GifImageView

- (id)initWithFrame:(CGRect)frame GifImageName:(NSString*)gitImageName{

self = [super initWithFrame:frame];

if (self) {

self.backgroundColor = [UIColor clearColor];

UIView *placeholdView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 1, 1)];

[self addSubview:placeholdView];

NSData *gifData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:gitImageName ofType:@"gif"]];

UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];

[webView setScalesPageToFit: YES];

[webView setBackgroundColor: [UIColor clearColor]];

[webView setOpaque: 0];

[self addSubview:webView];

[webView loadData:gifData MIMEType:@"image/gif" textEncodingName:@"" baseURL:[NSURL URLWithString:@""]];

[webView setUserInteractionEnabled:NO];

}

return self;

}

使用

...

#import "GifImageView.h"

...

GifImageView *gifView = [[GifImageView alloc] initWithFrame:CGRectMake(50, 270, 175, 105) GifImageName:@"gifImage"];

[self.view addSubview:gifView];

...

代碼語義明確我就不再寫注釋了

比較關(guān)鍵的是關(guān)閉了webView的交互,防止觸發(fā)滾動(dòng),長按等事件,但這不影響其父視圖的交互

移除

它就是一個(gè)View,如果你想移除它,就用你的洪荒之力吧

寫在最后

使用這個(gè)方案我自己有一個(gè)顧慮,就是用的多了會(huì)不會(huì)有一些問題,比如性能問題

有g(shù)if圖,能給一個(gè)App添彩不少,但是我到目前為止還沒有發(fā)現(xiàn)哪一個(gè)App中有大量的gif圖展示的,一般項(xiàng)目中不會(huì)有大量的gif圖存在(一些主要目的就是展示gif圖的App除外),我自己的項(xiàng)目中也只是個(gè)別地方用到,所以不能確定對大量使用這種方案會(huì)出現(xiàn)哪些問題。。。

當(dāng)然,這肯定不是唯一的方案,也不一定是最好的方案

如果你覺得這個(gè)方案有不妥的地方,歡迎留言指正

如果你有更好的方案,也歡迎留言共同學(xué)習(xí)

[1]:它是設(shè)定某種擴(kuò)展名的文件用一種應(yīng)用程序來打開的方式類型,當(dāng)該擴(kuò)展名文件被訪問的時(shí)候,瀏覽器會(huì)自動(dòng)使用指定應(yīng)用程序來打開?

可能會(huì)出現(xiàn)一個(gè)bug

就是讀取不到gif

關(guān)于[[NSBundle mainBundle] pathForResource:@"name" ofType:@"type"]找不到指定文件的解決辦法

最近在使用[[NSBundle mainBundle] pathForResource:@"name" ofType:@"type"]時(shí),找不到其對應(yīng)的文件,文件當(dāng)時(shí)是通過 右鍵->add files to 的方式添加到工程里面的,但是使用[[NSBundle mainBundle] pathForResource:@"name" ofType:@"type"]時(shí),無論如何都找不到文件,經(jīng)過了重啟工程 、clear工程以及重啟電腦等方式都無法解決問題。經(jīng)過思考和測試,感覺這可能是xcode的一個(gè)bug.

解決辦法及原理是這樣的,[NSBundle mainBundle]其獲取的路徑是你程序的安裝路徑下的資源文件位置。 在xcode中采用add file to 方式添加文件時(shí),一般情況下xcode會(huì)自動(dòng)將文件添加到你的資源文件,而且,這些文件在你工程的 build Phases中的 copy Bundle Resources中可以查看到。但是有時(shí)候,由于xcode的問題,采用add files to 不能自動(dòng)添加到你的資源文件中,這時(shí),可以采用copy Bundle Resources下面的“+”號,手動(dòng)將文件添加到你的資源文件中,這樣就可以解決問題了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 昨天無意中看到一個(gè)帖子,寫如何加載gif圖的,感覺好麻煩的樣子,本來很簡單的一件事,為什么搞的這么復(fù)雜呢? ~~...
    尹_路人閱讀 5,595評論 10 7
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開發(fā),例如說新浪微博、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 4,022評論 2 7
  • 1.系統(tǒng)UIImageView 多張圖片組成動(dòng)畫 /** * UIImageView 動(dòng)畫 * Memor...
    zhengelababy閱讀 9,273評論 3 6
  • IOS之UIWebView的使用 剛接觸IOS開發(fā)1年多,現(xiàn)在對于 混合式 移動(dòng)端開發(fā)越來越流行,因?yàn)殚_發(fā)成本上、...
    學(xué)無止境666閱讀 46,002評論 5 53
  • OS之UIWebView的使用 剛接觸IOS開發(fā)1年多,現(xiàn)在對于 混合式 移動(dòng)端開發(fā)越來越流行,因?yàn)殚_發(fā)成本上、速...
    知之未道閱讀 1,710評論 0 4

友情鏈接更多精彩內(nèi)容