我们首先先来看下去的类结构
其实CAAnimation是一个抽象类,官方文档说的也很明白我们不能够去直接创建CAAnimation的对象,而应该去创建其的子类对象
以及我们的CAPropertyAnimation也是一个抽象类,官方文档的介绍如下所示
Core Animation这个基本框架其实是用来绘图和做动画的,其中我们经常使用的UIView当中,UIView是界面的展示和用户的交互,其内部封装的是layer是用来真正的绘制的
其中Core Animation这个基本框架被包含在了QuartzCore当中,我们可以在下面看到
苹果在ios当中使用的是UIKit框架去显示出界面,而Mac则是使用的是AppKit框架,比如在ios当中使用的是UIView,而Mac当中使用的是NSView,底层都是CALayer进行显示的
Mac和ios当中界面的展示就是用的是同一种绘制方式和不同的交互方式,Mac当中使用的是键盘和鼠标交互的,而ios当中使用的是手势
UIView是封装了CALayer,CALayer是跨平台的,所有的绘图功能都是通过QuartzCore框架来操作CALayer完成的,其中UIView的动画其实就是封装了Layer的动画
下面我们就用一个例子就是使用CABasicAnimation动画,来看看其实我们所看到的UIView运动了,运动的只是其的layer,而其本身是没有变动的,我们可以在CAAnimationDelegate的代理方法中进行验证,案例如下所示
#import "ViewController.h"
@interface ViewController ()<CAAnimationDelegate>
@property (weak, nonatomic) IBOutlet UIView *Redview;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
CABasicAnimation * anim = [CABasicAnimation animation];
//设置动画变动的属性
anim.keyPath = @"position.y";
//定义作用对象结束变动的值
anim.toValue = @400;
anim.duration = 1;
/*
当为true时,当动画的活动持续时间已经过时,动画将从渲染树中删除。默认值为YES。
*/
anim.removedOnCompletion = NO;
/*
当动画完成时,我们的layer在其最终状态中仍然可见。
*/
anim.fillMode = kCAFillModeForwards;
anim.delegate = self;
[_Redview.layer addAnimation:anim forKey:nil];
}
//代理方法
- (void)animationDidStart:(CAAnimation *)anim
{
NSLog(@"%@",NSStringFromCGRect(_Redview.frame));
}
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
NSLog(@"%@",NSStringFromCGRect(_Redview.frame));
}
@end
物体刚开始所处的位置如下所示
物体运行结束之后的位置
然后我们去看我们的案例的输出,动画开始和结束其的frame是没有变化的