CALayer动画的暂停,恢复,以及结束时候的回调

简介:

CALayer动画的暂停,恢复,以及结束时候的回调

源码如下:

//
//  ViewController.m
//  AnimationLineView
//
//  Created by YouXianMing on 14/11/7.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "YXGCD.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // layer
    CALayer *layer        = [CALayer layer];
    layer.frame           = CGRectMake(100, 100, 3, 3);
    layer.backgroundColor = [UIColor redColor].CGColor;
    layer.delegate        = self;
    [self.view.layer addSublayer:layer];
    
    // 动画
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
    animation.fromValue         = [NSValue valueWithCGRect:layer.frame];
    animation.toValue           = [NSValue valueWithCGRect:CGRectMake(100, 100, 100, 3)];
    animation.duration          = 3.f;
    animation.delegate          = self;                   // 设置代理
    [layer addAnimation:animation forKey:@"YouXianMing"]; // 添加动画
    
    // 暂停动画
    [GCDQueue executeInMainQueue:^{
        [self pauseLayer:layer];
    } afterDelaySecs:1.5f];
    
    // 恢复动画
    [GCDQueue executeInMainQueue:^{
        [self resumeLayer:layer];
    } afterDelaySecs:3.f];
    
    // 移除动画(根据key值)
    [GCDQueue executeInMainQueue:^{
        [layer removeAnimationForKey:@"YouXianMing"];
    } afterDelaySecs:3.5f];
}

/**
 *  动画确实停止了
 *
 *  @param anim CAAnimation对象
 *  @param flag 是否是正常的移除
 */
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    NSLog(@"动画:%@ 是否动画中途被移除了:%d", anim, flag);
}

/**
 *  暂停
 *
 *  @param layer 被停止的layer
 */
-(void)pauseLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed               = 0.0;
    layer.timeOffset          = pausedTime;
}

/**
 *  恢复
 *
 *  @param layer 被恢复的layer
 */
-(void)resumeLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime     = [layer timeOffset];
    layer.speed                   = 1.0;
    layer.timeOffset              = 0.0;
    layer.beginTime               = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime               = timeSincePause;
}

@end

以下是需要注意的地方:

目录
相关文章
|
XML 图形学 数据格式
Animation组合动画踩坑-实现循环播放动画,可控制次数
Animation组合动画踩坑-实现循环播放动画,可控制次数
UIRefreshControl代码刷新
UIRefreshControl代码刷新
54 0
|
JavaScript 前端开发
一个按钮控制定时器的开始与暂停
一个按钮控制定时器的开始与暂停
一个按钮控制定时器的开始与暂停
SwiftUI—如何修改动画的播放速度和延迟时间
SwiftUI—如何修改动画的播放速度和延迟时间
256 0
SwiftUI—如何修改动画的播放速度和延迟时间
|
Dart 开发者
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(三)
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(三)
147 0
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(三)
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(一)
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(一)
131 0
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(二)
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(二)
132 0
|
前端开发 图形学 Python
动画系统之2D动画
动画系统之2D动画
143 0
动画系统之2D动画