美文网首页
iOS动画暂停与恢复

iOS动画暂停与恢复

作者: 卡丁车手 | 来源:发表于2017-02-22 19:54 被阅读2970次

扫描二维码成功时要暂停扫描动画,给用户扫描成功的感觉。实现代码比较简单。

OC代码

- (void)animationStart {
    // 扫描动画
    [UIView animateWithDuration:5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.lineImageView.frame = CGRectMake(0, 220, 220, 2);
    } completion:^(BOOL finished) {
    
    }];
}
- (void)animationPause {
    // 当前时间(暂停时的时间)
    // CACurrentMediaTime() 是基于内建时钟的,能够更精确更原子化地测量,并且不会因为外部时间变化而变化(例如时区变化、夏时制、秒突变等),但它和系统的uptime有关,系统重启后CACurrentMediaTime()会被重置
    CFTimeInterval pauseTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    // 停止动画
    self.layer.speed = 0;
    // 动画的位置(动画进行到当前时间所在的位置,如timeOffset=1表示动画进行1秒时的位置)
    self.layer.timeOffset = pauseTime;
}
- (void)animationContinue {
    // 动画的暂停时间
    CFTimeInterval pausedTime = self.layer.timeOffset;
    // 动画初始化
    self.layer.speed = 1;
    self.layer.timeOffset = 0;
    self.layer.beginTime = 0;
    // 程序到这里,动画就能继续进行了,但不是连贯的,而是动画在背后默默“偷跑”的位置,如果超过一个动画周期,则是初始位置
    // 当前时间(恢复时的时间)
    CFTimeInterval continueTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    // 暂停到恢复之间的空档
    CFTimeInterval timePause = continueTime - pausedTime;
    // 动画从timePause的位置从动画头开始
    self.layer.beginTime = timePause;
}

相关资料

关于duration、beginTime和timeOffset这些时间相关的属性,可以参考博客《控制动画时间》
简单来说,duration是动画持续的时间;beginTime是动画延迟执行的时间,如果想延迟1s执行,就设置为CACurrentMediaTime()+1;timeOffset是动画执行偏移,timeOffset=1表示动画从动画执行1s时的状态开始,如简单的位移动画,1s时移动到一半的位置,设置timeOffset=1时动画从一半的位置开始执行,到一半的位置结束,完成一个周期的动画。

相关文章

网友评论

      本文标题:iOS动画暂停与恢复

      本文链接:https://www.haomeiwen.com/subject/wmcmwttx.html