首页 > 其他 > 详细

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

时间:2014-11-07 14:18:56      阅读:357      评论:0      收藏:0      [点我收藏+]

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

bubuko.com,布布扣

源码如下:

//
//  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

以下是需要注意的地方:

bubuko.com,布布扣

bubuko.com,布布扣

 

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

原文:http://www.cnblogs.com/YouXianMing/p/4081143.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!