核心动画--基本动画

#pragma mark 动画暂停

- (void)pauseAnimation

{

    // 1. 取出当前的动画的时间点,就是要暂停的时间点

    CFTimeInterval pauseTime = [self.myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];

    // 2. 设置动画的时间偏移量,指定时间偏移量的目的是让动画定格在该时间点

    [self.myView.layer setTimeOffset:pauseTime];

    // 3. 将动画的运行速度设置为0,动画默认的运行速度是1.0

    [self.myView.layer setSpeed:0.0];

}

#pragma mark 恢复动画

- (void)resumeAnimation

{

    // 1. 将动画的时间偏移量作为暂停时的时间点

    CFTimeInterval pauseTime = self.myView.layer.timeOffset;

    // 2. 根据媒体时间计算出准确的启动动画时间,对之前暂停动画的时间进行修正

    CFTimeInterval beginTime = CACurrentMediaTime() - pauseTime;

    // 3. 要把偏移时间清零

    [self.myView.layer setTimeOffset:0.0];

    // 4. 设置图层的开始动画时间

    [self.myView.layer setBeginTime:beginTime];

    [self.myView.layer setSpeed:1.0];


}


注意:
// 对于循环播放的动画效果,一定要将removedOnCompletion设置为NO,否则无法恢复动画
    [anim setRemovedOnCompletion:NO];


#pragma mark 旋转动画

- (void)rotationAnimation

{

    // 1. 实例化基本动画

    // 默认按照z轴旋转

    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

    [self.myView.layer setAnchorPoint:CGPointMake(0, 0)];

    // 2. 设置动画属性

    // 不停的旋转

    // 1) 旋转一周

    [anim setToValue:@(2 * M_PI)];

    // 2) 不停的旋转 - 动画循环播放

    // HUGE_VALF 是一个非常大得浮点数,指定此数值可以认为动画无限循环

    // MAXFLOAT 

    [anim setRepeatCount:HUGE_VALF];

    [anim setDuration:0.5f];

    // 3) 动画完成时删除

    // 对于循环播放的动画效果,一定要将removedOnCompletion设置为NO,否则无法恢复动画

    [anim setRemovedOnCompletion:NO];

    // 3. 添加动画

    // key可以随便指定,用于判断图层中是否存在该动画

    [self.myView.layer addAnimation:anim forKey:@"rotationAnim"];


}

 

posted @ 2013-09-29 22:17  yyh123  阅读(264)  评论(0编辑  收藏  举报