昨天無意中看到一個(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)將文件添加到你的資源文件中,這樣就可以解決問題了。
