CAAnimation的基本概念

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));
    }];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值