CAAnimation的基本概念

原创 2015年11月17日 20:59:20

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));
    }];
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C语言基本概念

  • 2016-09-22 11:11
  • 414KB
  • 下载

ASP.NET一些基本概念

IOC和DI的区别 –IOC侧重于控制—把代码控制的一些解耦操作交给IOC容器—DI侧重于实现—为对象关联所需要的各种方法IOC相关的概念———IOC容器是为了实现解耦操作,让对象都依赖IOC容器,...

ospf基本概念

  • 2017-04-10 10:35
  • 578KB
  • 下载

Java基本概念-异常处理

一 异常处理 1 异常:程序在设计时或运行时产生的错误 2 异常处理:处理异常的过程,异常被处理后,异常就不存在了,程序就可以继续运行了。如果异常不被处理,程序就会被强行终止 3 异常的体...

复习Oracle数据库知识(一)——基本概念和sql简单语句

1.oracle的安装和卸载 百度上有很多资料 2.基本概念(以下都只是简单提纲,并不是具体内容) Oracle服务器(Oracle Database)的基本概念: ...

IEC61508基本概念

  • 2015-08-17 08:52
  • 186KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)