iOS序列桢动画创建方式

这篇博客详细介绍了在iOS中创建序列帧动画的两种方法。第一种方法使用`imageNamed:`加载图片,可能存在内存消耗问题。第二种方法通过文件路径`imageWithContentsOfFile:`来加载图片,以减少内存占用,并在动画结束后释放内存。文章提供了具体的代码实现和分析。
部署运行你感兴趣的模型镜像

方式一:

#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




您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值