免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

IOS中如何實現播放gif動態圖

這篇文章給大家分享的是有關IOS中如何實現播放gif動態圖的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創新互聯公司為客戶提供專業的做網站、成都做網站、程序、域名、空間一條龍服務,提供基于WEB的系統開發. 服務項目涵蓋了網頁設計、網站程序開發、WEB系統開發、微信二次開發、移動網站建設等網站方面業務。

一、引言

    在iOS開發中,UIImageView類專門來負責圖片數據的渲染,并且UIImageView也有幀動畫的方法來播放一組圖片,但是對于gif類型的數據,UIImageView中并沒有現成的接口提供給開發者使用,在iOS中一般可以通過兩種方式來播放gif動態圖,一種方式是通過ImageIO框架中的方法將gif文件中的數據進行解析,再使用coreAnimation核心動畫來播放gif動畫,另一種方式計較簡單,可以直接通過webView來渲染gif圖。

二、為原生的UIImageView添加類別來支持gif動態圖的播放

     gif動態圖文件中包含了一組圖片及其信息,信息主要記錄著每一幀圖片播放的時間,我們如果獲取到了gif文件中所有的圖片同時又獲取到每一幀圖片播放的時間,就可以為UIImageView添加核心動畫的方法來讓其播放gif的內容了。

    首先解析gif文件中的數據,代碼如下:

//要引入ImageIO庫
#import <ImageIO/ImageIO.h>

//解析gif文件數據的方法 block中會將解析的數據傳遞出來
-(void)getGifImageWithUrk:(NSURL *)url
    returnData:(void(^)(NSArray<UIImage *> * imageArray,
        NSArray<NSNumber *>*timeArray,
        CGFloat totalTime,
        NSArray<NSNumber *>* widths,
        NSArray<NSNumber *>* heights))dataBlock{
 //通過文件的url來將gif文件讀取為圖片數據引用
 CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
 //獲取gif文件中圖片的個數
 size_t count = CGImageSourceGetCount(source);
 //定義一個變量記錄gif播放一輪的時間
 float allTime=0;
 //存放所有圖片
 NSMutableArray * imageArray = [[NSMutableArray alloc]init];
 //存放每一幀播放的時間
 NSMutableArray * timeArray = [[NSMutableArray alloc]init];
 //存放每張圖片的寬度 (一般在一個gif文件中,所有圖片尺寸都會一樣)
 NSMutableArray * widthArray = [[NSMutableArray alloc]init];
 //存放每張圖片的高度
 NSMutableArray * heightArray = [[NSMutableArray alloc]init];
 //遍歷
 for (size_t i=0; i<count; i++) {
  CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
  [imageArray addObject:(__bridge UIImage *)(image)];
  CGImageRelease(image);
  //獲取圖片信息
  NSDictionary * info = (__bridge NSDictionary*)CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
  CGFloat width = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelWidth] floatValue];
  CGFloat height = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelHeight] floatValue];
  [widthArray addObject:[NSNumber numberWithFloat:width]];
  [heightArray addObject:[NSNumber numberWithFloat:height]];
  NSDictionary * timeDic = [info objectForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];
  CGFloat time = [[timeDic objectForKey:(__bridge NSString *)kCGImagePropertyGIFDelayTime]floatValue];
  allTime+=time;
  [timeArray addObject:[NSNumber numberWithFloat:time]];
  CFRelease(info);
 }
 CFRelease(source);
 dataBlock(imageArray,timeArray,allTime,widthArray,heightArray);
}

為UIImageView添加一個設置gif圖內容的方法:

-(void)yh_setImage:(NSURL *)imageUrl{
  __weak id __self = self;
  [self getGifImageWithUrk:imageUrl returnData:^(NSArray<UIImage *> *imageArray, NSArray<NSNumber *> *timeArray, CGFloat totalTime, NSArray<NSNumber *> *widths, NSArray<NSNumber *> *heights) {
   //添加幀動畫
   CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
   NSMutableArray * times = [[NSMutableArray alloc]init];
   float currentTime = 0;
   //設置每一幀的時間占比
   for (int i=0; i<imageArray.count; i++) {
    [times addObject:[NSNumber numberWithFloat:currentTime/totalTime]];
    currentTime+=[timeArray[i] floatValue];
   }
   [animation setKeyTimes:times];
   [animation setValues:imageArray];
   [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
   //設置循環
   animation.repeatCount= MAXFLOAT;
   //設置播放總時長
   animation.duration = totalTime;
   //Layer層添加
   [[(UIImageView *)__self layer]addAnimation:animation forKey:@"gifAnimation"];
  }];
}

使用代碼示例如下:

 UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0 , 320, 200)];
 NSURL * url = [[NSURL alloc]initFileURLWithPath:[[NSBundle mainBundle] pathForResource:imageName ofType:nil]];
 [imageView yh_setImage:url];
 [self.view addSubview:imageView];

IOS中如何實現播放gif動態圖

三、使用UIWebView來加載gif動態圖數據

    iOS中的UIWebView功能十分強大,可以通過UIWebView為載體,來展示gif圖。并且這種方法也十分簡單,代碼如下:

 //讀取gif數據
   NSData *gifData = [NSData dataWithContentsOfURL:imageUrl];
  UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
  //取消回彈效果
  webView.scrollView.bounces=NO;
  webView.backgroundColor = [UIColor clearColor];
  //設置縮放模式
  webView.scalesPageToFit = YES;
  //用webView加載數據
  [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];

四、兩種加載gif動態圖方式的優劣

    經過測試,從加載速度上來說,通過UIImageView類別加載的方式更加快速,UIWebView的方式加載時間會稍長,但是從性能上來比較,WebView的方式性能更優,播放的gif動態圖更加流暢。在開發中,可以根據需求,適當選擇,例如雖然WebView加載的方式性能更好,但是在許多情況下,原生的UIImageView能夠更加自由的讓開發者進行擴展。

感謝各位的閱讀!關于“IOS中如何實現播放gif動態圖”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

當前名稱:IOS中如何實現播放gif動態圖
轉載來于:http://m.newbst.com/article48/pjdhep.html

成都網站建設公司_創新互聯,為您提供微信公眾號網站營銷企業網站制作網站策劃軟件開發域名注冊

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

搜索引擎優化