iOS之GIF动画文件的播放
来源:互联网 发布:泡面怎么吃才健康 知乎 编辑:程序博客网 时间:2024/05/18 01:25
前言
播放gif动画的方法有多种:
1、将gif图片分解成多张图片使用UIImageView播放
2、webView直接播放.gif文件
3、使用第三方播放
一、UIImageView实现gif动画
用imageView制作gif动画最经典就是汤姆猫,感兴趣的可以百度或者谷歌一下“iOS汤姆猫源代码”。在这里只是简单的介绍imageview的gif动画实现,你也可以用计时器(NSTimer).在做这些之前必须要将gif分解成一张张PNG图片。
UIImageView *gifImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; gifImageView.center = self.view.center; [self.view addSubview:gifImageView]; NSMutableArray *images = [NSMutableArray array]; for (int i=0; i < 10; i++) { [images addObject:[UIImage imageNamed:[NSString stringWithFormat:@"image%d",i]]]; } gifImageView.animationImages = images; gifImageView.animationDuration = 5.0; gifImageView.animationRepeatCount = NSUIntegerMax; [gifImageView startAnimating];
二、UIWebView实现.gif动画文件的播放
webView可以加载很多文件是个很强大的控件,实现gif播放简单直接不过只能循环播放。
CGSize size = [UIImage imageNamed:@"name.gif"].size; UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, size.width, size.height)]; webView.center = self.view.center; webView.userInteractionEnabled = NO; webView.backgroundColor = [UIColor whiteColor]; [self.view addSubview:webView]; NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"name" ofType:@"gif"]]; [webView loadData:data MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
三、第三方实现播放gif动画
首先需要导入两个库:ImageIO.framework和MobileCoreServices.framework;具体实现是采用ImageIO库对.gif文件进行解析获取相关资源最后进行动画的播放,下面是自己写的播放gif动画的loading实例
1、GifLoadingView.h
#import <UIKit/UIKit.h>@interface GifLoadingView : UIView+(void)startLoading;+(void)endLoading;@end
2、GifLoadingView.m
#define GIF_WIDTH 80*1.2#import "GifLoadingView.h"#import <ImageIO/ImageIO.h>#import <MobileCoreServices/MobileCoreServices.h>@interface GifLoadingView()@property (nonatomic, strong)NSMutableArray<UIImage *> *images;@property (nonatomic, strong)GifLoadingView *loading;@property (nonatomic, strong)UIView *gifContentView;@property (nonatomic, assign)CGImageSourceRef gif;@property (nonatomic, strong)NSDictionary *gifDic;@property (nonatomic, assign)size_t index;@property (nonatomic, assign)size_t count;@property (nonatomic, strong)NSTimer *timer;@end@implementation GifLoadingView- (instancetype)init{ self = [self initWithFrame:CGRectMake(0, 0, GIF_WIDTH, GIF_WIDTH)]; if (self) { self.backgroundColor = [UIColor whiteColor]; self.layer.cornerRadius = GIF_WIDTH/2; self.layer.masksToBounds = YES; [self createGif]; } return self;}- (void)createGif{// _gifContentView.layer.borderColor = UIColorFromRGB(No_Choose_Color).CGColor;// _gifContentView.layer.borderWidth = 1.0; NSDictionary *gifLoopCount = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]; _gifDic = [NSDictionary dictionaryWithObject:gifLoopCount forKey:(NSString *)kCGImagePropertyGIFDictionary]; NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"loading" ofType:@"gif"]]; _gif = CGImageSourceCreateWithData((CFDataRef)gif, (CFDictionaryRef)_gifDic); _count = CGImageSourceGetCount(_gif); _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(startLoading) userInfo:nil repeats:YES]; [_timer fire];}-(void)startLoading{ _index ++; _index = _index%_count; CGImageRef ref = CGImageSourceCreateImageAtIndex(_gif, _index, (CFDictionaryRef)_gifDic); self.layer.contents = (__bridge id)ref; CFRelease(ref);}+ (void)startLoading{ GifLoadingView *loading = [[GifLoadingView alloc]init]; UIWindow *keyView = [UIApplication sharedApplication].keyWindow; loading.center = keyView.center; [keyView addSubview:loading]; dispatch_main_after(5.0f, ^{ [GifLoadingView endLoading]; });}+ (void)endLoading{ for (UIView *view in [UIApplication sharedApplication].keyWindow.subviews) { if ([view isKindOfClass:[GifLoadingView class]]) {// [UIView animateWithDuration:1.0 animations:^{// view.alpha = 0;// } completion:^(BOOL finished) { [((GifLoadingView *)view) stopGif]; [view removeFromSuperview];// }]; } }}- (void)stopGif{ [_timer invalidate]; _timer = nil;}- (void)dealloc{ CFRelease(_gif);}static void dispatch_main_after(NSTimeInterval delay, void (^block)(void)){ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ block(); });}
总结
简要总结一些三个方法的利弊:
UIImageView采用帧动画将图片一张张显示,这个方法可以调节播放次数和速度但图片过多过大内存会很有压力。另外在保证播放的动画清晰和时长的情况下.gif文件大小会远小于多张.png图片的大小。
UIWebView实现播放gif特别简单直接,如果你只想单纯的播放一下建议使用此方法。弊端就是只能循环播放(>_<),无法控制它的暂停和其他操作。
使用第三方播放gif动画集合了第一种方法好处你可以对动画进行一系列操作,在.gif文件比较大的情况下建议使用。(个人喜欢使用此方法)。
- iOS之GIF动画文件的播放
- iOS 播放gif 动画
- iOS Gif动画播放
- ios播放gif动画
- iOS 播放GIF动画
- iOS 简单的播放gif动画
- iOS 简单的播放gif动画
- ios中播放gif动画
- ios中播放gif动画
- iOS中播放gif动画
- ios中播放gif动画
- ios中播放gif动画
- ios中播放gif动画
- ios中播放gif动画
- ios中播放gif动画
- iOS开发之旋转动画及GIF格式图片的播放
- iOS播放GIF动画的几种方式
- iOS 简单实现gif动画播放
- hmm 隐马尔可夫——代码应用
- oracle 域索引创建及维护
- 转载自http://blog.csdn.net/zhengzhihust/article/details/44151785
- android-设备信息工具类
- Vector和ArrayList的比较
- iOS之GIF动画文件的播放
- Android应用的闪退(crash)分析
- Java中long型转float型那点事
- swiper的基础使用(十三)
- Java代码质量检查工具及使用案例
- 相除保留一位小数
- 1.1字符串旋转--左移,右移x位置--三步反转
- iOS UI篇10- Storyboard(多个Storyboard的连接)
- typedef常见用法