¿Hay alguna forma de pausar una CABasicAnimation?

Tengo una animación básica de hilado del iPhone. ¿Hay alguna manera de que pueda “pausar” la animación para que se mantenga la posición de la vista? Supongo que una forma de hacer esto sería hacer que la animación se “complete” en lugar de llamar “eliminar”, ¿cómo lo haría?

CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2]; rotationAnimation.duration = 100; rotationAnimation.cumulative = YES; rotationAnimation.repeatCount = HUGE_VALF; rotationAnimation.removedOnCompletion = NO; rotationAnimation.fillMode = kCAFillModeForwards; [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Recientemente apareció la nota técnica de Apple QA1673 que describe cómo pausar / reanudar la animación de la capa.

La lista de animaciones de pausa y reanudación está a continuación:

 -(void)pauseLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; layer.timeOffset = pausedTime; } -(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; } 

Editar: iOS 10 introdujo una API nueva – UIViewPropertyAnimator que permite manejar las animaciones de forma más interactiva, por ejemplo, facilita la pausa y la reanudación de la animación o la “busca” con un valor de progreso particular.

Respuesta para Swift 3:

Créditos @Vladimir

Código:

  func pauseAnimation(){ var pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) layer.speed = 0.0 layer.timeOffset = pausedTime } func resumeAnimation(){ var pausedTime = layer.timeOffset layer.speed = 1.0 layer.timeOffset = 0.0 layer.beginTime = 0.0 let timeSincePause = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime layer.beginTime = timeSincePause } 

Establezca el estado actual de la capa de su vista para que coincida con el estado de presentationLayer , luego elimine la animación:

 CALayer *pLayer = [myView.layer presentationLayer]; myView.layer.transform = pLayer.transform; [myView.layer removeAnimationForKey:@"rotationAnimation"]; 

Puede usar un temporizador o manejar el método delegado de animación:

 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 

Aquí está mi código:

 // ... [self startAnimation]; // ... - (void)startAnimation { CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.fromValue = [NSNumber numberWithFloat:0]; rotationAnimation.toValue = [NSNumber numberWithFloat: M_2_PI]; rotationAnimation.duration = 1.0; rotationAnimation.cumulative = YES; // rotationAnimation.repeatCount = 0; // <- if repeatCount set to infinite, we'll not receive the animationDidStop notification when the animation is repeating rotationAnimation.removedOnCompletion = NO; rotationAnimation.fillMode = kCAFillModeForwards; rotationAnimation.delegate = self; // <- hanlde the animationDidStop method [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; } - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { if (shouldContinueAnimation) // <- set a flag to start/stop the animation [self startAnimation]; } 

Espero que te ayude.

El más simple

 self.viewBall.layer.position = self.viewBall.layer.presentationLayer().position 
Intereting Posts