关于CAAnimation的结构

我们首先先来看下去的类结构

关于CAAnimation的结构_第1张图片

其实CAAnimation是一个抽象类,官方文档说的也很明白我们不能够去直接创建CAAnimation的对象,而应该去创建其的子类对象
关于CAAnimation的结构_第2张图片

以及我们的CAPropertyAnimation也是一个抽象类,官方文档的介绍如下所示
关于CAAnimation的结构_第3张图片

Core Animation这个基本框架其实是用来绘图和做动画的,其中我们经常使用的UIView当中,UIView是界面的展示和用户的交互,其内部封装的是layer是用来真正的绘制的

其中Core Animation这个基本框架被包含在了QuartzCore当中,我们可以在下面看到
关于CAAnimation的结构_第4张图片

苹果在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 *)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

物体刚开始所处的位置如下所示

关于CAAnimation的结构_第5张图片

物体运行结束之后的位置

关于CAAnimation的结构_第6张图片

然后我们去看我们的案例的输出,动画开始和结束其的frame是没有变化的

这里写图片描述

你可能感兴趣的:(ios-核心动画)