# CoreAnimation
##简介:
- 1.核心动画是直接作用在CALayer上的,并非UIView
- 2.核心动画的执行过程都是在后台进行,不会阻塞主线程
##动画类型:
- 1.CABasicAnimation:基本动画,设定某个属性从某个值到某个值
- 2.CAKeyFrameAnimation:关键帧动画,设定某个属性的值从某个值到某个值,再到某个值,积累的关键值挨着去做
- 3.CAAnimationGroup:组动画,把其他的动画对象添加到组里面,将添加的动画对象一次执行
- 4.CATransitionAnimation:转场动画,从一个场景切换到另一个场景,系统已经实现,不需要我们自己写
- 5.CAPropertyAnimation:属性动画,它是CABasicAnimation和CAKeyFrameAnimation的父类
##基本使用:
- 1.创建动画对象:实例化的时候必须调用类方法,animateWithKeyPath:这个keyPath就是设定要执行动画的属性
- 2.设置动画属性
- 3.把动画对象添加到某个Layer上
- 4.若需要停止啊动画,可以调用remove方法移除动画
###1.CABasicAnimation使用示例:
属性值:fromValue,toValue,byValue
```objc
//1.实例化动画变量,keyPath就是设置要执行动画的属性
CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"position.y"];
// 2.0设置时间
anima.duration = 0.5;
// 2.1设置属性
anima.fromValue = @50;
anima.toValue = @500;
// 2.2 设置动画的代理
anima.delegate = self;
//2.3设置结束时候不要闪回去
anima.fillMode = kCAFillModeForwards;
anima.removedOnCompletion = NO;
// 3.添加到按钮的layer上
[self.blueView.layer addAnimation:anima forKey:nil];
```
- UIBasicAnimation 的keyPath如下
![](01-position.png)
![](02-bounds.png)
![](03-transform.png)
### 2.CAKeyFrameAnimation
- 0.实例化跟上面的基本动画相似,必须调用类方法,通过设定keyPath告诉系统需要执行动画的属性,假设实例化出来的对象叫anima
- 1.属性值:
- values:一个存储NSValue对象的数组,外界将需要执行动画的几个帧的画面所在的点的位置转化成NSValue对象,保存在数组中,然后赋值给实例化出来的anima对象的values属性
- path:外界可以将一个bezierPath对象转化成CGPath对象,赋值给anima.path
- repeatCount:动画重复次数
###3.CAAnimationGroup
```objc
// 1.创建组动画对象
CAAnimationGroup *group = [CAAnimationGroup animation];
// 2.设置动画属性,demo2,demo3,demo4都是不同的动画对象
group.animations = @[
[self demo2],
[self demo3],
[self demo4],
];
group.duration = 2;
group.repeatCount = CGFLOAT_MAX;
// 3.添加到layer上
[self.magLayer addAnimation:group forKey:nil];
```
###4.CAAnimation
一般情况下不需要我们自己写,系统已经实现.
- 下面来一个特殊的示例,就是支持左右两个方向的转场动画的实现,通过设置转场动画的属性,实现不同的动画效果.
```objc
#pragma mark - 2.轻扫触发
- (void)swipeAction:(UISwipeGestureRecognizer *)recognizer {
// MARK: - 转场动画
// 1.创建动画对象
CATransition *anim = [CATransition animation];
// 两个属性 type[动画的类型], subType[子类型]
// 2.设置动画属性
anim.type = kCATransitionReveal;
if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) {
NSLog(@"向右");
self.idx--;
if (self.idx == 0) {
self.idx = 5;
}
anim.subtype = kCATransitionFromLeft;
} else {
NSLog(@"向左");
self.idx++;
if (self.idx == 6) {
self.idx = 1;
}
anim.subtype = kCATransitionFromRight;
}
// 3.添加动画
[_imgView.layer addAnimation:anim forKey:nil];
```
##简介:
- 1.核心动画是直接作用在CALayer上的,并非UIView
- 2.核心动画的执行过程都是在后台进行,不会阻塞主线程
##动画类型:
- 1.CABasicAnimation:基本动画,设定某个属性从某个值到某个值
- 2.CAKeyFrameAnimation:关键帧动画,设定某个属性的值从某个值到某个值,再到某个值,积累的关键值挨着去做
- 3.CAAnimationGroup:组动画,把其他的动画对象添加到组里面,将添加的动画对象一次执行
- 4.CATransitionAnimation:转场动画,从一个场景切换到另一个场景,系统已经实现,不需要我们自己写
- 5.CAPropertyAnimation:属性动画,它是CABasicAnimation和CAKeyFrameAnimation的父类
##基本使用:
- 1.创建动画对象:实例化的时候必须调用类方法,animateWithKeyPath:这个keyPath就是设定要执行动画的属性
- 2.设置动画属性
- 3.把动画对象添加到某个Layer上
- 4.若需要停止啊动画,可以调用remove方法移除动画
###1.CABasicAnimation使用示例:
属性值:fromValue,toValue,byValue
```objc
//1.实例化动画变量,keyPath就是设置要执行动画的属性
CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"position.y"];
// 2.0设置时间
anima.duration = 0.5;
// 2.1设置属性
anima.fromValue = @50;
anima.toValue = @500;
// 2.2 设置动画的代理
anima.delegate = self;
//2.3设置结束时候不要闪回去
anima.fillMode = kCAFillModeForwards;
anima.removedOnCompletion = NO;
// 3.添加到按钮的layer上
[self.blueView.layer addAnimation:anima forKey:nil];
```
- UIBasicAnimation 的keyPath如下
![](01-position.png)
![](02-bounds.png)
![](03-transform.png)
### 2.CAKeyFrameAnimation
- 0.实例化跟上面的基本动画相似,必须调用类方法,通过设定keyPath告诉系统需要执行动画的属性,假设实例化出来的对象叫anima
- 1.属性值:
- values:一个存储NSValue对象的数组,外界将需要执行动画的几个帧的画面所在的点的位置转化成NSValue对象,保存在数组中,然后赋值给实例化出来的anima对象的values属性
- path:外界可以将一个bezierPath对象转化成CGPath对象,赋值给anima.path
- repeatCount:动画重复次数
###3.CAAnimationGroup
```objc
// 1.创建组动画对象
CAAnimationGroup *group = [CAAnimationGroup animation];
// 2.设置动画属性,demo2,demo3,demo4都是不同的动画对象
group.animations = @[
[self demo2],
[self demo3],
[self demo4],
];
group.duration = 2;
group.repeatCount = CGFLOAT_MAX;
// 3.添加到layer上
[self.magLayer addAnimation:group forKey:nil];
```
###4.CAAnimation
一般情况下不需要我们自己写,系统已经实现.
- 下面来一个特殊的示例,就是支持左右两个方向的转场动画的实现,通过设置转场动画的属性,实现不同的动画效果.
```objc
#pragma mark - 2.轻扫触发
- (void)swipeAction:(UISwipeGestureRecognizer *)recognizer {
// MARK: - 转场动画
// 1.创建动画对象
CATransition *anim = [CATransition animation];
// 两个属性 type[动画的类型], subType[子类型]
// 2.设置动画属性
anim.type = kCATransitionReveal;
if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) {
NSLog(@"向右");
self.idx--;
if (self.idx == 0) {
self.idx = 5;
}
anim.subtype = kCATransitionFromLeft;
} else {
NSLog(@"向左");
self.idx++;
if (self.idx == 6) {
self.idx = 1;
}
anim.subtype = kCATransitionFromRight;
}
// 3.添加动画
[_imgView.layer addAnimation:anim forKey:nil];
```