iOS 自定义方法 - 播放GIF
///////////////////////第一种///////////////////////
//
// GifView.h
// GIFViewer
//
// Created by xToucher04 on 11-11-9.
// Copyright 2011 Toucher. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <ImageIO/ImageIO.h>
@interface GifView : UIView {
CGImageSourceRef gif;
NSDictionary *gifProperties;
size_t index;
size_t count;
NSTimer *timer;
}
- (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath;
- (id)initWithFrame:(CGRect)frame data:(NSData *)_data;
@end
//例子
////
//// ViewController.m
//// 播放动态图片
////
//
//#import "ViewController.h"
//#import "GifView.h"
//
//@interface ViewController ()
//
//@end
//
//@implementation ViewController
//
//- (void)viewDidLoad {
// [super viewDidLoad];
// //第一种 用UIImageView中的动画数组播放动画
// [self showGifImageMethodOne];
// //第二种 用UIWebView显示
// [self showGifImageMethodTwo];
// //第三种 用第三方GifView显示本地图片
// [self showGifImageMethodThree];
// //用第三方显示从网络获取的动态图片
// [self showGifImageMethodFour];
//}
//
//#pragma mark 播放动态图片方式1 UIImageView
//-(void)showGifImageMethodOne {
// //第一种 用UIImageView中的动画数组播放动画
// //创建UIImageView,添加到界面
// UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
// [self.view addSubview:imageView];
// //创建一个数组,数组中按顺序添加要播放的图片(图片为静态的图片)
// NSMutableArray *imgArray = [NSMutableArray array];
// for (int i=1; i<7; i++) {
// UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"clock%02d.png",i]];
// [imgArray addObject:image];
// }
// //把存有UIImage的数组赋给动画图片数组
// imageView.animationImages = imgArray;
// //设置执行一次完整动画的时长
// imageView.animationDuration = 6*0.15;
// //动画重复次数 (0为重复播放)
// imageView.animationRepeatCount = 0;
// //开始播放动画
// [imageView startAnimating];
// //停止播放动画 - (void)stopAnimating;
// //判断是否正在执行动画 - (BOOL)isAnimating;
//}
//
//#pragma mark 播放动态图片方式2 UIWebView
//-(void)showGifImageMethodTwo {
// //第二种 用UIWebView显示
// //得到图片的路径
// NSString *path = [[NSBundle mainBundle] pathForResource:@"happy" ofType:@"gif"];
// //将图片转为NSData
// NSData *gifData = [NSData dataWithContentsOfFile:path];
// //创建一个webView,添加到界面
// UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 150, 200, 200)];
// [self.view addSubview:webView];
// //自动调整尺寸
// webView.scalesPageToFit = YES;
// //禁止滚动
// webView.scrollView.scrollEnabled = NO;
// //设置透明效果
// webView.backgroundColor = [UIColor clearColor];
// webView.opaque = 0;
// //加载数据
// [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
//}
//
//#pragma mark 播放动态图片方式3 第三方显示本地动态图片
//-(void)showGifImageMethodThree {
// //方式一
// //将图片转为NSData数据
// NSData *localData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"bird" ofType:@"gif"]];
// //创建一个第三方的View显示图片
// GifView *dataView = [[GifView alloc] initWithFrame:CGRectMake(0, 300, 200, 100) data:localData];
// [self.view addSubview:dataView];
// //方式二
// //得到图片的路径
// NSString *path = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@"gif"];
// GifView *dataView2 = [[GifView alloc] initWithFrame:CGRectMake(200, 300, 150, 100) filePath:path];
// [self.view addSubview:dataView2];
//}
//
//#pragma mark 播放动态图片方式3 第三方显示从网络获取的动态图片
//-(void)showGifImageMethodFour {
// // 网络图片
// NSData *urlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic19.nipic.com/20120222/8072717_124734762000_2.gif"]];
// //创建一个第三方的View显示图片
// GifView *dataViewWeb = [[GifView alloc] initWithFrame:CGRectMake(20, 420, 280, 100) data:urlData];
// [self.view addSubview:dataViewWeb];
//}
//
//- (void)didReceiveMemoryWarning {
// [super didReceiveMemoryWarning];
//}
//
//@end
////////////////////////////////
//
// GifView.m
// GIFViewer
//
// Created by xToucher04 on 11-11-9.
// Copyright 2011 Toucher. All rights reserved.
//
#import "GifView.h"
#import <QuartzCore/QuartzCore.h>
@implementation GifView
- (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath {
self = [super initWithFrame:frame];
if (self) {
gifProperties = [[NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]
forKey:(NSString *)kCGImagePropertyGIFDictionary] retain];
gif = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:_filePath], (CFDictionaryRef)gifProperties);
count =CGImageSourceGetCount(gif);
timer = [NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(play) userInfo:nil repeats:YES];
[timer fire];
}
return self;
}
- (id)initWithFrame:(CGRect)frame data:(NSData *)_data{
self = [super initWithFrame:frame];
if (self && _data) {
gifProperties = [[NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]
forKey:(NSString *)kCGImagePropertyGIFDictionary] retain];
gif = CGImageSourceCreateWithData((CFDataRef)_data, (CFDictionaryRef)gifProperties);
count =CGImageSourceGetCount(gif);
timer = [NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(play) userInfo:nil repeats:YES];
[timer fire];
}
return self;
}
-(void)play {
index ++;
index = index % count;
CGImageRef ref = CGImageSourceCreateImageAtIndex(gif, index, (CFDictionaryRef)gifProperties);
self.layer.contents = (id)ref;
CFRelease(ref);
}
-(void)removeFromSuperview {
NSLog(@"removeFromSuperview");
[timer invalidate];
timer = nil;
[super removeFromSuperview];
}
- (void)dealloc {
NSLog(@"dealloc");
CFRelease(gif);
[gifProperties release];
[super dealloc];
}
@end
///////////////////////第二种///////////////////////
//
// UIImageView+Gif.h
// DemoTest1
//
// Created by 李鹏超 on 16/8/11.
// Copyright © 2016年 李鹏超. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIImageView (Gif)
-(void)getGifImageWithUrk:(NSURL *)url
returnData:(void(^)(NSArray<UIImage *> * imageArray,
NSArray<NSNumber *>*timeArray,
CGFloat totalTime,
NSArray<NSNumber *>* widths,
NSArray<NSNumber *>* heights))dataBlock;
-(void)yh_setImage:(NSURL *)imageUrl;
@end
//使用例子
//使用代码示例如下:
//UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 50 , 320, 100)];
//NSURL * url = [[NSURL alloc]initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1-1.gif" ofType:nil]];
// [imageView yh_setImage:url];
// [imageView getGifImageWithUrk:url returnData:^(NSArray<UIImage *> *imageArray, NSArray<NSNumber *> *timeArray, CGFloat totalTime, NSArray<NSNumber *> *widths, NSArray<NSNumber *> *heights) {
//
// }];
//SDWebImage中的方法例子
// self.loadingImageView.image = [UIImage sd_animatedGIFWithData:imageData];
//#import <UIKit/UIKit.h>
//
//@interface UIImage (GIF)
//
//+ (UIImage *)sd_animatedGIFNamed:(NSString *)name;
//
//+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
//
//- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size;
//
//@end
//getHUb -- 第三方 FLAnimatedImage
////////////////////////////
//
// UIImageView+Gif.m
// DemoTest1
//
// Created by 李鹏超 on 16/8/11.
// Copyright © 2016年 李鹏超. All rights reserved.
//
#import "UIImageView+Gif.h"
#import <ImageIO/ImageIO.h>
@implementation UIImageView (Gif)
//解析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]];
}
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"];
}];
}
@end
iOS 自定义方法 - 播放GIF的更多相关文章
- iOS音乐播放器相关
iOS音乐播放器框架主要有两大类:AvPlayer.AvaudioPlayer AvPlayer 能播放本地及网络歌曲 AvaudioPlayer 能播放本地歌曲.有相关代理方法(其实也可以播放网络歌 ...
- 一个功能齐全的IOS音乐播放器应用源码
该源码是在ios教程网拿过来的,一个不错的IOS音乐播放器应用源码,这个是我当时进公司时 我用了一晚上写的 图片都是在别的地方扒的,主要是歌词同步,及上一曲,下一曲,功能齐全了 ,大家可以学习一下吧 ...
- IOS 音频播放
iOS音频播放 (一):概述 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究.写这个系列的博客目的一方面希望能够抛砖 ...
- iOS音频播放(一):概述
(本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉 ...
- iOS音频播放、录音、视频播放、拍照、视频录制
随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...
- iOS AVAudioPlayer播放音频时声音太小
iOS AVAudioPlayer播放音频时声音太小 //引入AVFoundation类库,设置播放模式就可以了 do { try AVAudioSession.sharedInstance().ov ...
- iOS直播-播放基于RTMP协议的视频
iOS直播-播放基于RTMP协议的视频 流媒体协议介绍 1. 伪流媒体: 渐进式下载 : 边下边存, 文件会保存 使用http协议,也能够实现视频播放, 也能快进快退等, 体验上跟流媒体很像. 优酷, ...
- iOS音频播放 (二):AudioSession 转
原文出处 :http://msching.github.io/blog/2014/07/08/audio-in-ios-2/ 前言 本篇为<iOS音频播放>系列的第二篇. 在实施前一篇中所 ...
- iOS音频播放之AudioQueue(一):播放本地音乐
AudioQueue简单介绍 AudioStreamer说明 AudioQueue具体解释 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput Audi ...
随机推荐
- 浅谈跨域以及WebService对跨域的支持
跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...
- 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- MyBatis在insert插入操作时返回主键ID的配置
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过Mapper.XML配置的方式来完成这个功能. 在 INSER ...
- PHP安全之Web攻击
一.SQL注入攻击(SQL Injection) 攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态 ...
- jQuery全局Ajax事件处理器
1. .ajaxComplete( handler(event, XMLHttpRequest, ajaxOptions) ) 每当一个Ajax请求完成,jQuery就会触发ajaxComplete ...
- Sass:初识Sass与Koala工具的使用
一.下载Koala(找到合适的系统版本)并安装 二.先新建一个css文件夹,并在里面新建一个文本文档(.txt),将其命名为demo.scss 三.打开Koala,将css文件夹拽进来,可以修改一下输 ...
- 分布式系统理论进阶 - Paxos变种和优化
引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工程实践,了解基本原理还不够. 有很多基于Pax ...
- FFmpeg学习1:视频解码
在视频解码前,先了解以下几个基本的概念: 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分. 容器/多媒体文件(Container/File):没有了解 ...
- [原创]django+ldap+memcache实现单点登录+统一认证
前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...
- WCF Basics - FAQs Series【WCF基础----问答系列教程】
WCF学习系列一[WCF Interview Questions-Part 1 翻译系列] WCF学习系列二---[WCF Interview Questions – Part 2 翻译系列] WCF ...