顯示gif動(dòng)態(tài)圖片

在iOS中播放動(dòng)態(tài)圖片,常用的方法有兩種,一種是利用UIWebView,一種是利用UIImageView的序列幀動(dòng)畫(huà)。


使用UIWebView播放gif:
//web播放gif動(dòng)態(tài)圖片
//創(chuàng)建UIWebView對(duì)象并設(shè)置位置居中
UIWebView *webView = [[UIWebView alloc] init];
webView.center = self.view.center;

//獲取圖片的大小
CGSize size = [UIImage imageNamed:@"smile.gif"].size;
webView.bounds = CGRectMake(0, 0, size.width, size.height);

//將圖片的webView的大小和圖片的大小設(shè)置成一致
webView.scrollView.contentSize = size;

//添加到當(dāng)前的ViewController上
[self.view addSubview:webView];

//關(guān)閉交互功能
webView.userInteractionEnabled = NO;

//將圖片位置設(shè)置為url
NSURL *url = [[NSBundle mainBundle] URLForResource:@"smile" withExtension:@"gif"];
[webView loadRequest:[NSURLRequest requestWithURL:url]];  

//讀取gif數(shù)據(jù) (ps:上面和下面的結(jié)果是一樣的)
//    NSData *gifData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"smile" ofType:@"gif"]];
//下面函數(shù)中,后面兩個(gè)參數(shù),因?yàn)橐蛃wift的?、!保持一致,所以如果為空的話會(huì)有警告
//    [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];

用UIWebView來(lái)顯示gif,有時(shí)候位置會(huì)發(fā)生偏移,這個(gè)是為什么,我也不知道,希望有知道的大大可以告訴我。為了解決這個(gè)問(wèn)題,我使用了UIWebView里的delegate的webViewDidFinishLoad:方法:

//首先設(shè)置delegate
webView.delegate = self;

//實(shí)現(xiàn)方法來(lái)調(diào)整位置
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    webView.scrollView.contentOffset = CGPointMake(0, 0);
}

使用UIImageView的序列幀動(dòng)畫(huà)播放gif

在代碼之前,我們首先要將gif的每一幀圖片都取出來(lái),使用蘋(píng)果電腦打開(kāi)gif圖片,就可以發(fā)現(xiàn)其每一幀的圖片,將每一幀的圖片都保存為png格式(jpeg也可以,但是jpeg會(huì)失真,蘋(píng)果官方推薦png格式),并命名好一系列利于循環(huán)獲取的名字。將這些圖片都放入到我們的項(xiàng)目中,我demo中的gif有4幀動(dòng)畫(huà),我直接將圖片的命名為 數(shù)字.png (1.png, 2.png, 3.png, 4.png)。

//創(chuàng)建UIImageView對(duì)象并設(shè)置位置居中
UIImageView *imageView = [[UIImageView alloc] init];
imageView.center = self.view.center;

//獲取圖片的大小
CGSize size = [UIImage imageNamed:@"1.gif"].size;
imageView.bounds = CGRectMake(0, 0, size.width, size.height);

//將圖片的imageView的大小和圖片的大小設(shè)置成一致
imageView.bounds = CGRectMake(0, 0, size.width, size.height);

//添加到當(dāng)前的ViewController上
[self.view addSubview:webView];

//創(chuàng)建一個(gè)可變數(shù)組來(lái)存儲(chǔ)每一幀的圖片    
NSMutableArray *imageArray = [[NSMutableView alloc] init];

//取出每一幀圖片,存放到imageArray中
for (int i = 1 ; i < 5; i++) {
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png", i]];
    NSLog(@"%@", image);

    [imageArray addObject:image];
}

//設(shè)置序列幀
imageView.animationImages = imageArray;
//設(shè)置動(dòng)畫(huà)播放一次的時(shí)間
imageView.animationDuration = 0.4;
//設(shè)置動(dòng)畫(huà)的重復(fù)播放次數(shù)(0為無(wú)限次播放)
imageView.animationRepeatCount = 0;
//開(kāi)始動(dòng)畫(huà)
[imageView startAnimating];

使用UIImageView來(lái)播放動(dòng)畫(huà),還有一個(gè)問(wèn)題,就是內(nèi)存占用大,特別圖片多而且大的時(shí)候,所以每一次不再需要播放gif的會(huì)后,最好把這些圖片都釋放掉。如果只需要播放可數(shù)次數(shù),那么可以這么設(shè)置:

//在延遲動(dòng)畫(huà)的10次播放時(shí)長(zhǎng)后,釋放掉imageView.animationImages 
NSTimeInterval delay = self.imageView.animationDuration * 10;
[self.imageView performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:delay];

相比而言,我覺(jué)得使用UIWebView來(lái)顯示gif會(huì)比較便捷,不用講每一幀的圖片取出,也不用擔(dān)心內(nèi)存的占用,唯一不科學(xué)的也就位置的問(wèn)題了。

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

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

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