iOS播放动态图片gif
iOS播放动态图片gif
播放多张静态图片
- 需要多张连续的静态图片,这个最占内存
/// 1、原生播放动态图片(轮流播放多张静态图片)
- (void)animationImages {
//创建UIImageView,添加到界面
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 200, 300)];
[self.view addSubview:imageView];
imageView.center = self.view.center;
//创建一个数组,数组中按顺序添加要播放的图片(图片为静态的图片)
NSMutableArray *imgArray = [NSMutableArray array];
for (int i=1; i<23; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"pickView%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;
UIWebView
实现动画效果
- 内存占用39M
/// 2、播放动态图片(gif,UIWebView实现),内存占用39M
- (void)animationImagesWithUIWebView {
//创建一个webView,添加到界面
UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 300)];
[self.view addSubview:web];
//得到图片的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"pickView使用" ofType:@"gif"];
//将图片转为NSData
NSData *gifData = [NSData dataWithContentsOfFile:path];
//自动调整尺寸
web.scalesPageToFit = YES;
//禁止滚动
web.scrollView.scrollEnabled = NO;
//设置透明效果
web.backgroundColor = [UIColor clearColor];
web.opaque = 0;
//加载数据
[web loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
}
YYImage实现
- 使用
YYImage
来实现动画,占用30M
/// 3、播放动态图片(gif,YYKit实现),内存占用30M
- (void)animationImagesWithYYImage {
// YYImage
YYImage *image = [YYImage imageNamed:@"pickView使用"];
YYAnimatedImageView *imageView = [[YYAnimatedImageView alloc] initWithImage:image];
[self.view addSubview:imageView];
}
YYImage
的内存优化还是相当不错的,如果条件允许,不妨试一下。
YYImage其他方法
- 1、方法
imageNamed
/// 内存占用,YYImage 重写的imageNamed和原生的内存占用差别不大
- (void)YYImageTest2 {
// 循环500次测试
for (NSInteger i = 0; i < 500; i ++ ) {
// UIImage *image2 = [UIImage imageNamed:@"pickView01"];
// UIImageView *imageView3 = [[UIImageView alloc] initWithImage:image2];
// [self.view addSubview:imageView3];
YYImage *image = [YYImage imageNamed:@"1"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:imageView];
}
}
- 2、方法
imageWithData
/// 内存占用,YYImage 重写的imageWithData会对内存进行优化,降低内存占用
- (void)YYImageTest1 {
// 循环100次测试
for (NSInteger i = 0; i < 100; i ++ ) {
UIImage *image2 = [UIImage imageNamed:@"1"];
NSData *data = UIImagePNGRepresentation(image2);
// UIImage *image3 = [UIImage imageWithData:data scale:1]; // 原始方法加载的图片内存中没情况,会一直累加,大概68M
YYImage *image3 = [YYImage imageWithData:data scale:1];// 每次for循环结束都会回收内存,大概30M,区别很明显
UIImageView *imageView3 = [[UIImageView alloc] initWithImage:image3];
[self.view addSubview:imageView3];
}
}
- 3、iOS 信号量机制使用
YYImage
类中用到了信号量来保证同步
/// iOS 信号量机制使用
- (void)seamaphore {
int data = 3;
__block int mainData = 0;
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_async(queue, ^(void) {
int sum = 0;
for(int i = 0; i < 444445; i++)
{
sum += data;
NSLog(@" >> Sum: %d", sum);
}
// 添加信号量
dispatch_semaphore_signal(sem);
});
// 等待信号量
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
for(int j=0;j<5;j++)
{
mainData++;
NSLog(@">> Main Data: %d",mainData);
}
}
- 其他使用和原生的差不多
YYAnimatedImage
- 播放动画
/// 3、播放动态图片(gif,YYKit实现),30M
- (void)animationImagesWithYYImage {
// YYImage
YYImage *image = [YYImage imageNamed:@"pickView使用"];
_imageView = [[YYAnimatedImageView alloc] initWithImage:image];
_imageView.autoPlayAnimatedImage = NO;
[self.view addSubview:_imageView];
}
// 控制
- (void)btnClicked:(UIButton *)btn {
switch (btn.tag) {
case 1: // play
{
[_imageView startAnimating];
}
break;
case 2: // pause
{
}
break;
case 3: // stop
{
[_imageView stopAnimating];
}
break;
default:
break;
}
}
本文来自博客园,作者:struggle_time,转载请注明原文链接:https://www.cnblogs.com/songliquan/p/12784421.html