方式一:
#import "ViewController.h"
@interface ViewController ()
//展现序列帧动画的控件
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
//秀恩爱的动画
- (IBAction)showlove;
// 枪
- (IBAction)gun;
// 三条狗
- (IBAction)threeDog;
@end
@implementation ViewController
//秀恩爱的动画
- (IBAction)showlove {
[self startMyAnimating:67 andImageName:@"showLove"];
}
- (IBAction)gun {
[self startMyAnimating:40 andImageName:@"gun"];
}
- (IBAction)threeDog {
[self startMyAnimating:50 andImageName:@"threeDog"];
}
//封装代码的原则
//相同的代码 保持不变
//不同的代码,作为参数传入
- (void)startMyAnimating:(NSInteger )imageCount andImageName:(NSString *)name{
//判断之前的动画执行结束,在运行下面的代码
if ([self.imageView isAnimating]) return;
//1. 创建可变数组,用来存放图片对象
NSMutableArray *nmArray = [NSMutableArray array];
//2. 给nmArray添加图片对象
for (int i = 0; i < imageCount; i ++) {
//2.1 获取图片对象
//2.1.1 获取图片的名字
NSString *imageName = [NSString stringWithFormat:@"%@%03d",name,i+1];
//2.1.2 根据图片名字获取图片对象
UIImage *image = [UIImage imageNamed:imageName];
//2.1.3 添加到可变数组中
[nmArray addObject:image];
}
//3.给它设置图片数组,就可以实现序列帧动画
self.imageView.animationImages = nmArray;
//4. 设置图片执行的时间
self.imageView.animationDuration = self.imageView.animationImages .count * 0.1;
//5. 设置图片执行的次数
self.imageView.animationRepeatCount = 1;
//6. 开启动画
[self.imageView startAnimating];
}
@end
方式二:
由于上面的做法非常消耗内存,,建议采取下面第二种方法
#import "ViewController.h"
@interface ViewController ()
//展现序列帧动画的控件
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
//秀恩爱的动画
- (IBAction)showlove;
// 枪
- (IBAction)gun;
// 三条狗
- (IBAction)threeDog;
@end
@implementation ViewController
//秀恩爱的动画
- (IBAction)showlove {
[self startMyAnimating:67 andImageName:@"showLove"];
}
- (IBAction)gun {
[self startMyAnimating:40 andImageName:@"gun"];
}
- (IBAction)threeDog {
[self startMyAnimating:50 andImageName:@"threeDog"];
}
//封装代码的原则
//相同的代码 保持不变
//不同的代码,作为参数传入
// 当图片通过imageNamed方式进行加载的时候,无论是否有人使用
// 它默认是将图片放入缓冲区 --> 内存中的一块区域
// 静态区 常量区 --> 只有当程序关闭,才会释放
// 缺点:占用内存, 好处就是执行速度快,数据加载一次之后,就不需要重新加载
// 宁可再加载一次,也不希望占用内存
//[UIImage imageNamed:imageName];
// 另外一种加载图片的方法
// 通过imageNamed方式加载图片,可以不需要写后缀名
//UIImage *image = [UIImage imageWithContentsOfFile:path];
// 通过文件加载,需要些后缀名
// 当把图片放到Assets里面,系统最终会把图片打包,那么就无法通过文件路径的方式进行加载
- (void)startMyAnimating:(NSInteger )imageCount andImageName:(NSString *)name{
//判断之前的动画执行结束,在运行下面的代码
if ([self.imageView isAnimating]) return;
//1. 创建可变数组,用来存放图片对象
NSMutableArray *nmArray = [NSMutableArray array];
//2. 给nmArray添加图片对象
for (int i = 0; i < imageCount; i ++) {
//2.1 获取图片对象
//2.1.1 获取图片的名字
NSString *imageName = [NSString stringWithFormat:@"%@%03d",name,i+1];
//2.1.2 根据图片名字获取图片对象
// UIImage *image = [UIImage imageNamed:imageName];
//1. 获取手机路径
NSBundle *bundle = [NSBundle mainBundle];
//2. 获取全路径
NSString *path = [bundle pathForResource:imageName ofType:@"png"];
// NSLog(@"%@",path);
//文件的全路径进行加载
UIImage *image = [UIImage imageWithContentsOfFile:path];
//2.1.3 添加到可变数组中
[nmArray addObject:image];
}
//3.给它设置图片数组,就可以实现序列帧动画
//
self.imageView.animationImages = nmArray;
//4. 设置图片执行的时间
self.imageView.animationDuration = self.imageView.animationImages .count * 0.1;
//5. 设置图片执行的次数
self.imageView.animationRepeatCount = 1;
//6. 开启动画
[self.imageView startAnimating];
//7. 释放内存--> 动画执行结束
// self.imageView.animationImages = nil;
//延迟加载-->对象进行调用的方法
//self 第一个参数代表一个对象
//:@selector(<#selector#>) 代表调用的方法
//withObject 调用方法的时候,是否需要传入参数
// afterDelay 延迟的时间
// 在写延迟的时间最好再加上1秒 防止由于卡顿引起动画没执行完,就释放
[self performSelector:@selector(removeImageViewAnimationImages) withObject:nil afterDelay:self.imageView.animationDuration + 1];
}
- (void)removeImageViewAnimationImages{
self.imageView.animationImages = nil;
}
@end
这篇博客详细介绍了在iOS中创建序列帧动画的两种方法。第一种方法使用`imageNamed:`加载图片,可能存在内存消耗问题。第二种方法通过文件路径`imageWithContentsOfFile:`来加载图片,以减少内存占用,并在动画结束后释放内存。文章提供了具体的代码实现和分析。
4058

被折叠的 条评论
为什么被折叠?



