2010-03-18 10 views
17

Sto usando un CAKeyframeAnimation per animare una vista lungo un CGPath. Quando l'animazione è terminata, mi piacerebbe poter chiamare qualche altro metodo per eseguire un'altra azione. C'è un buon modo per farlo?Come specificare il selettore quando CAKeyframeAnimation è terminato?

Ho guardato usando setAnimationDidStopSelector di UIView, tuttavia dai documenti questo sembra si applica solo quando viene utilizzato all'interno di un blocco di animazione UIView (beginAnimations e commitAnimations). Ho anche fatto una prova nel caso, ma non sembra funzionare.

Ecco alcuni esempi di codice (questo è all'interno di un metodo sottoclasse personalizzata UIView):

// These have no effect since they're not in a UIView Animation Block 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];  

// Set up path movement 
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"path"]; 
pathAnimation.calculationMode = kCAAnimationPaced; 
pathAnimation.fillMode = kCAFillModeForwards; 
pathAnimation.removedOnCompletion = NO; 
pathAnimation.duration = 1.0f; 

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, self.center.x, self.center.y); 

// add all points to the path 
for (NSValue* value in myPoints) { 
    CGPoint nextPoint = [value CGPointValue]; 
    CGPathAddLineToPoint(path, NULL, nextPoint.x, nextPoint.y); 
} 

pathAnimation.path = path; 
CGPathRelease(path); 

[self.layer addAnimation:pathAnimation forKey:@"pathAnimation"]; 

Una soluzione stavo considerando che dovrebbe funzionare, ma non sembra come il modo migliore, è quello di utilizzare PerformSelector di NSObject: withObject: afterDelay :. Finché imposto il ritardo uguale alla durata dell'animazione, dovrebbe andare bene.

C'è un modo migliore? Grazie!

risposta

34

Oppure si può racchiudere l'animazione con:

[CATransaction begin]; 
[CATransaction setCompletionBlock:^{ 
        /* what to do next */ 
       }]; 
/* your animation code */ 
[CATransaction commit]; 

e impostare il blocco di completamento per gestire ciò che è necessario fare.

4

Sintassi Swift 3 per questo answer.

CATransaction.begin() 
CATransaction.setCompletionBlock { 
    //Actions to be done after animation 
} 
//Animation Code 
CATransaction.commit()