核心动画(基础动画)

一.简单介绍
CAPropertyAnimation的子类
属性解析:
fromValue:keyPath相应属性的初始值
toValue:keyPath相应属性的结束值
随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐的变为toValue。
如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。
比如,CALayer的position初始值为(0,0),CABasicAnimation的fromValue为(10,10),toValue为(100,100),虽然动画执行完毕后图层保持在(100,100)这个位置,实质上图层的position还是为(0,0)。

二.平移动画

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong) CALayer *myLayer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //创建layer
    CALayer *layer = [CALayer layer];
    //设置layer属性
    layer.bounds = CGRectMake(0, 0, 50, 80);
    layer.backgroundColor = [UIColor yellowColor].CGColor;
    layer.position = CGPointMake(50, 50);
    layer.anchorPoint = CGPointMake(0, 0);
    layer.cornerRadius = 20;
    //添加layer
    [self.view.layer addSublayer:layer];
    _myLayer = layer;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//设置动画(基础动画)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //创建核心动画
    CABasicAnimation *animation = [CABasicAnimation animation];

    //告诉系统要执行什么的动画
    animation.keyPath = @"position";
    //设置通过动画,将layer从哪儿移动到哪儿
    animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)];

    //设置动画执行完毕之后不删除动画
    animation.removedOnCompletion = NO;
    //设置保持动画的最新状态
    animation.fillMode = kCAFillModeForwards;

    //添加核心动画到layer
    [self.myLayer addAnimation:animation forKey:nil];
}

@end

说明:
byValue和toValue的区别,前者是在当前的位置上增加多少,后者是到指定的位置。
设置代理:设置动画的代理,可以监听动画的执行过程,这里设置控制器为代理。
代码示例:

@interface ViewController ()

@property(nonatomic,strong) CALayer *myLayer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //创建layer
    CALayer *layer = [CALayer layer];
    //设置layer的属性
    layer.bounds = CGRectMake(0, 0, 50, 80);
    layer.backgroundColor = [UIColor yellowColor].CGColor;
    layer.position = CGPointMake(50, 50);
    layer.anchorPoint = CGPointMake(0, 0);
    layer.cornerRadius = 20;
    //添加layer
    [self.view.layer addSublayer:layer];
    self.myLayer = layer;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//设置动画(基础动画)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //创建核心动画
    CABasicAnimation *animation = [CABasicAnimation animation];
    //告诉系统要执行什么样的动画
    animation.keyPath = @"position";
    //设置通过动画,将layer从哪儿移动到哪儿
    animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)];
    //设置动画执行完毕之后不删除动画
    animation.removedOnCompletion = NO;
    //设置保持动画的最新状态
    animation.fillMode = kCAFillModeForwards;
    animation.delegate = self;
    //打印
    NSString *str = NSStringFromCGPoint(self.myLayer.position);
    NSLog(@"执行前:%@",str);
    //添加核心动画到layer
    [_myLayer addAnimation:animation forKey:nil];
}

#pragma mark -Core Animation Delegate
- (void)animationDidStart:(CAAnimation *)anim{
    NSLog(@"开始执行动画");
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
    //动画执行完毕,打印执行完毕后的position值
    NSString *str = NSStringFromCGPoint(_myLayer.position);
    NSLog(@"执行后:%@",str);
}

@end

通过打印结构可以看出,属性值还是动画执行前的初始值{50,50},并没有真正被改变为{200,300}。

三.缩放动画

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong) CALayer *myLayer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //创建layer
    CALayer *layer = [CALayer layer];
    //设置layer的属性
    layer.bounds = CGRectMake(0, 0, 50, 80);
    layer.backgroundColor = [UIColor yellowColor].CGColor;
    layer.position = CGPointMake(50, 50);
    layer.anchorPoint = CGPointMake(0, 0);
    layer.cornerRadius = 20;
    //添加layer
    [self.view.layer addSublayer:layer];
    self.myLayer = layer;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//设置动画(基础动画)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //创建动画
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
    //设置动画执行时间
    animation.duration = 2.0;
    //设置动画执行完毕后不删除动画
    animation.removedOnCompletion = NO;
    //设置保持动画的最新状态
    animation.fillMode = kCAFillModeForwards;
    //修改属性,执行动画
    animation.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
    //添加动画到layer
    [_myLayer addAnimation:animation forKey:nil];
}

#pragma mark -Core Animation Delegate
- (void)animationDidStart:(CAAnimation *)anim{

}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

}

@end

四.旋转动画

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong) CALayer *myLayer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //创建layer
    CALayer *layer = [CALayer layer];
    //设置layer的属性
    layer.bounds = CGRectMake(0, 0, 50, 80);
    layer.backgroundColor = [UIColor yellowColor].CGColor;
    layer.position = CGPointMake(50, 50);
    layer.anchorPoint = CGPointMake(0, 0);
    layer.cornerRadius = 20;
    //添加layer
    [self.view.layer addSublayer:layer];
    self.myLayer = layer;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//设置动画(基础动画)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //创建动画
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    //设置动画执行时间
    animation.duration = 2.0;
    //设置动画执行完毕后不删除动画
    animation.removedOnCompletion = NO;
    //设置保持动画的最新状态
    animation.fillMode = kCAFillModeForwards;
    //修改属性,执行动画
    animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2+M_PI_4, 1, 1, 0)];
    //添加动画到layer
    [_myLayer addAnimation:animation forKey:nil];
}

#pragma mark -Core Animation Delegate
- (void)animationDidStart:(CAAnimation *)anim{

}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

}

@end

提示:如果要让图形以2D的方式旋转,只需要把CATransform3DMakeRotation在z方向上的值改为1即可。

五.补充
可以通过transform (KVC)的方式来进行设置

@interface ViewController ()

@property(nonatomic,strong) CALayer *myLayer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //创建layer
    CALayer *layer = [CALayer layer];
    //设置layer的属性
    layer.bounds = CGRectMake(0, 0, 50, 80);
    layer.backgroundColor = [UIColor yellowColor].CGColor;
    layer.position = CGPointMake(50, 50);
    layer.anchorPoint = CGPointMake(0, 0);
    layer.cornerRadius = 20;
    //添加layer
    [self.view.layer addSublayer:layer];
    self.myLayer = layer;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//设置动画(基础动画)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //创建动画
    CABasicAnimation *animation = [CABasicAnimation animation];
    animation.keyPath = @"transform";
    //设置动画执行时间
    animation.duration = 2.0;
    //设置动画执行完毕后不删除动画
    animation.removedOnCompletion = NO;
    //设置保持动画的最新状态
    animation.fillMode = kCAFillModeForwards;
    //修改属性,执行动画
    animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(0, 100, 1)];
    //添加动画到layer
    [_myLayer addAnimation:animation forKey:nil];
}

#pragma mark -Core Animation Delegate
- (void)animationDidStart:(CAAnimation *)anim{

}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

}

@end
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值