我正在编写一个页面,检查设备是否已链接到系统。 该页面每2秒发送一次请求6次,在此期间(可能长达10秒)该页面显示一个动画加载圈。
问题在于:当我按下主页按钮并立即重新打开应用程序时,动画停止。
以下是我所知道的:
CABasicAnimation
:
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = @(2 * M_PI);
rotationAnimation.duration = 1.5;
rotationAnimation.cumulative = YES;
[loadingCircle.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
UIView animateWithDuration...
:
- (void)rotateView:(UIView *)view {
[UIView animateWithDuration:0.75 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
view.transform = CGAffineTransformRotate(view.transform, M_PI);
} completion:^(BOOL finished) {
if (finished) {
[self rotateView:view];
}
}];
}
...
- viewDidLoad {
...
[self rotateView:loadingCircle];
}
我知道在第一个实现中,设置rotationAnimation.removedOnCompletion = NO;
将恢复动画。
我的问题是:当我使用第二个实现时,实现相同效果的等效方法是什么。
答案 0 :(得分:1)
使用UIView animateWithDuration实际上对视图的基础l
属性应用相同的效果,因此您可以像这样暂停和恢复。
beq_nat h x
你必须自己将其转化为客观c,抱歉。归功于原始解决方案here。
如果您希望将代码保留在本地而不是放入应用代理,则可以通过layer
订阅func pauseLayer(layer: CALayer) {
let pausedTime: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
func resumeLayer(layer: CALayer) {
let pausedTime: CFTimeInterval = layer.timeOffset
layer.speed = 1.0
layer.timeOffset = 0.0
layer.beginTime = 0.0
let timeSincePause: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime
layer.beginTime = timeSincePause
}
通知。返回时,您可以使用匹配的UIApplicationDidEnterBackgroundNotification
通知重新启动动画。