扫描二维码成功时要暂停扫描动画,给用户扫描成功的感觉。实现代码比较简单。
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时动画从一半的位置开始执行,到一半的位置结束,完成一个周期的动画。