C'è un modo per mettere in pausa un CABasicAnimation?
-
22-09-2019 - |
Domanda
Ho un'animazione base rotante di iPhone. C'è un modo che io possa "mettere in pausa" l'animazione in modo che la posizione della vista sarà mantenuto? Credo che un modo per farlo sarebbe quello di provocare l'animazione a "completare" invece di chiamare "rimuovere" su di esso, come avrei fatto?
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"];
Soluzione
Recentemente è apparso nota tecnica di Apple QA1673 descrive come mettere in pausa / riprendere l'animazione del livello.
pausa e riprendere le animazioni un annuncio è di seguito:
-(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;
}
Modifica IOS 10 illustra nuova API -. UIViewPropertyAnimator che permette di gestire animazioni più interattivo, ad esempio rende facile per sospendere e riprendere animazione o 'cercare' a qualche particolare valore progresso
Altri suggerimenti
risposta Per Swift 3:
Credits @Vladimir
Codice:
func pauseAnimation(){
let pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
func resumeAnimation(){
let 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
}
Imposta lo stato attuale del livello di immagine per abbinare lo stato del presentationLayer
, quindi rimuovere l'animazione:
CALayer *pLayer = [myView.layer presentationLayer];
myView.layer.transform = pLayer.transform;
[myView.layer removeAnimationForKey:@"rotationAnimation"];
È possibile utilizzare un timer o gestire il metodo di animazione delegato:
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
Qui è il mio codice:
// ...
[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];
}
Spero che ti può aiutare.
più semplice
self.viewBall.layer.position = self.viewBall.layer.presentationLayer().position