2010-02-21 10 views
43

Ho un'animazione di base per l'iPhone. C'è un modo in cui posso "mettere in pausa" l'animazione in modo che la posizione della vista venga mantenuta? Immagino che un modo per farlo sarebbe quello di far "completare" l'animazione invece di chiamare "rimuovere" su di essa, come potrei farlo?C'è un modo per sospendere un CABasicAnimation?

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"]; 

risposta

143

recentemente apparso nota tecnica di Apple QA1673 descrive come mettere in pausa l'animazione/del livello curriculum.

pausa e riprendere le animazioni elenco è 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; 
} 

Edit: iOS 10 ha introdotto nuove API - UIViewPropertyAnimator che permette di gestire animazioni più interattivo, ad esempio, rende facile per mettere in pausa e riprendere animazione o 'cercarlo' per un particolare valore di progresso.

+0

Questo funziona per me bene, TUTTAVIA, quando sono in pausa e ruoto il mio dispositivo, perdo tutta la capacità di interagire con l'applicazione. In realtà non si è schiantato, tuttavia sembra "congelato". C'è un possibile conflitto con "willAnimateRotationToInterfaceOrientation"? – YoCoh

+0

@YoCoh, può effettivamente mettere in pausa anche le animazioni di rotazione standard per una vista e, come durante le animazioni, l'interazione dell'utente può essere disabilitata (probabilmente è così) e l'animazione standard non termina con UI bloccato in stato disabilitato. non so come risolverlo – Vladimir

+0

http://ronnqvi.st/controlling-animation-timing/ spiega come funziona questo codice –

6

impostare 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"]; 
+4

Anche se questo salva la posizione, non serve come il punto di partenza quando aggiungo nuovamente l'animazione alla vista, la vista si sposta leggermente più lentamente per contenere la distanza più breve in th la stessa quantità di tempo C'è un altro passo da fare per poter riprendere l'animazione da dove era stata interrotta? – mclaughlinj

0

è possibile utilizzare un timer o gestire il metodo di animazione delegato:

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

Ecco 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.

+4

ATTENZIONE !!! questo non è il modo migliore per farlo, a meno che tu non abbia qualche particolare necessità di farlo in questo modo. Immagina di avere un'animazione in esecuzione infinita. Questo metodo non è d'aiuto quando stiamo mettendo in pausa l'animazione prima che l'app entri in background e poi tenti di riprenderla quando entra in foreground. – Anshu

0

più semplice

self.viewBall.layer.position = self.viewBall.layer.presentationLayer().position 
7

risposta Per Swift 3:

Credits @Vladimir

Codice:

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 
} 
Problemi correlati