关于CAAnimation的结构

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

这里写图片描述

其实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是没有变化的

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值