1.实现的效果:
没有设置fillMode=kCAFillModeForwards和removedOnCompletion=NO时,动画效果结束之后图层恢复到原来的状态
2.CABasicAnimation是什么?
CABasicAnimation中文翻译为基础动画,它继承自CAPropertyAnimation,CAPropertyAnimation继承自CAAnimation。
3.CAPropertyAnimation的简单介绍
CAPropertyAnimation中文翻译为属性动画,它是CAAnimation的子类,它自己也是一个抽象类,应该使用它的子类进行创建动画。它的两个子类分别是:CABasicAnimation和CAKeyFrameAnimation。
4.常用的属性
<1>keyPath:它是CAPropertyAnimation的属性。通过把CALayer对象的属性赋值给keyPath,然后通过其他属性对参数进行修改,从而达到动画的效果。比如:CALayer对象有一个position属性,设置keyPath = @"position";然后修改通过修改其他属性,从而达到平移的动画效果。
<2>fromValue:keyPath设置的属性的初始值
<3>toValue:keyPath设置的属性的结束值
5.注意事项:
随着动画的进行,在长度为duration的持续时间内,keyPath对应属性的值从fromValue渐渐的变为toValue的值。
如果fillMode=kCAFillModeForwards和removedOnCompletion=NO;那么动画效果执行完毕后,图层会保持动画执行之后的状态。但是,实质上,图层的属性值还是动画之前的初始值,并没有真正的被改变。比如CALayer对象的position初始值为(0,0),CABasicAnimation对象设置的fromValue = (10,10),toValue = (200,200),虽然动画结束之后,图层保持在了(200,200)的位置,但是实质上图层的position依然是(0,0)。
6.参考代码:
@interface ViewController ()
@end
@implementation ViewController {
CALayer* _redLayer;
}
- (void)viewDidLoad {
[super viewDidLoad];
_redLayer = [[CALayer alloc] init];
_redLayer.backgroundColor = [UIColor redColor].CGColor;
_redLayer.position = CGPointMake(200, 200);
_redLayer.bounds = CGRectMake(0, 0, 50, 50);
[self.view.layer addSublayer:_redLayer];
}
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{
//1.创建动画对象
CABasicAnimation* basicAnimation = [[CABasicAnimation alloc] init];
//2.设置动画属性
//2.1设置动画属
basicAnimation.keyPath = @"transform.scale";
//2.2设置动画结束值
basicAnimation.byValue = @(M_PI/4);
//2.3设置动画结束后保持在原来的位置
basicAnimation.removedOnCompletion = NO;
basicAnimation.fillMode = kCAFillModeForwards;
//2.4设置动画时间
basicAnimation.duration = .5;
//3.添加动画对象到对应的layer上面
[_redLayer addAnimation:basicAnimation forKey:nil];
}