CAAnimation:所有动画对象的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它具体的子类.
使用Core Animation创建动画不仅简单,而且具有更好的性能,原因有2个:
1)Core Animation动画在单独的线程中完成,不会阻塞主线程。
2)Core Animation动画只会重绘界面变化的部分(局部刷新).
Core Animation动画涉及下面API(简单介绍一下):
CAAnimation: 它是所有动画类的基类,它实现了CAMediaTiming协议,提供了动画的持续时间,速度和重复计数等。CAAnimation还实现了CAAction协议,该协议为CALayer动画触发的动作提供了标准话的响应。
CATransition: CAAnimation的子类,CAAnimation可通过预置的过渡效果来控制CALayer层的过渡动画。
CAPropertyAnimation:它是CAAnimation的一个子类,它代表一个属性动画,可通过+ (instancetype)animationWithKeyPath:(NSString *)path;类方法来创建属性动画实例,该方法需要指定一个CALayer支持动画的属性,然后通过它的子类(CABasicAnimation,CAKeyframeAnimation)控制CALayer的动画属性慢慢地改变,即可实现CALayer动画。
CABasicAnimation: CAPropertyAnimation的子类,简单控制CALayer层的属性慢慢改变,从而实现动画效果。很多CALayer层的属性值的修改默认会执行这个动画类,比如大小,透明度,颜色等属性。
CAKeyframeAnimation: CAPropertyAnimation的子类,支持关键帧的属性动画,该动画最大的特点在于可通过values属性设置多个关键帧,通过多个关键帧可以指定动画的各个阶段的关键值。
CAAnimationGroup: CAAnimation的子类,用于将多个动画组合在一起执行。
关系图如下:
相关属性解析:
removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards.
fillMode:决定当前对象在非active时间段的行为.比如动画开始之前,动画结束之后.
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态.
kCAFillModeBackwards 在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始。
kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.
delegate:动画代理
@property(retain) id delegate
为CAAnimation设置代理。默认为nil。
注意:一个CAAnimation实例,不能设置delegate为self。会引起循环引用。
@property(retain) CAMediaTimingFunction *timingFunction 速度控制函数,控制动画运行的节奏.
kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为.
CAAnimation实例方法
- (BOOL)shouldArchiveValueForKey:(NSString *)key
返回指定的属性值是否可以归档。
key:指定的属性。
YES:指明该属性可以被归档;NO:不能被归档。
CAAnimation协议方法
(void)animationDidStart:(CAAnimation *)theAnimation
动画开始时,执行的方法。
theAnimation:正在执行动画的CAAnimation实例。(void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
动画执行完成或者动画为执行被删除时,执行该方法。
theAnimation:完成或者被删除的动画实例
简单使用动画实现平移操作:
#import "MainViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface MainViewController ()
@property (weak, nonatomic) UIView *myView;
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UIView *myView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
[myView setBackgroundColor:[UIColor redColor]];
[self.view addSubview:myView];
self.myView = myView;
}
#pragma mark - 动画代理方法
#pragma mark 动画开始(极少用)
- (void)animationDidStart:(CAAnimation *)anim
{
NSLog(@"开始动画");
}
#pragma mark 动画结束(通常在动画结束后,做动画的后续处理)
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
NSString *type = [anim valueForKey:@"animationType"];
if ([type isEqualToString:@"translationTo"]) {
// 1. 通过键值取出需要移动到的目标点
CGPoint point = [[anim valueForKey:@"targetPoint"]CGPointValue];
NSLog(@"目标点: %@", NSStringFromCGPoint(point));
// 2. 设置myView的坐标点
[self.myView setCenter:point];
}
NSLog(@"结束动画,myView: %@", NSStringFromCGRect(self.myView.frame));
}
#pragma mark - touch事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = touches.anyObject;
CGPoint location = [touch locationInView:self.view];
if ([touch view] == self.myView) {
NSLog(@"点击myView");
}
[UIView animateWithDuration:1.0f animations:^{
[self.myView setCenter:location];
} completion:^(BOOL finished) {
NSLog(@"%@", NSStringFromCGRect(self.myView.frame));
}];
}