objective guide framework developer apple iphone core-animation cakeyframeanimation catransaction

iphone - guide - objective c documentation



¿Cómo especificar el selector cuando finaliza CAKeyframeAnimation? (3)

CAKeyframeAnimation es una subclase de CAAnimation. Hay una propiedad delegate en CAAnimation. El delegado puede implementar el -animationDidStop:finished: El resto debe ser fácil.

Estoy usando un CAKeyframeAnimation para animar una vista a lo largo de un CGPath. Cuando termine la animación, me gustaría poder llamar a otro método para realizar otra acción. ¿Existe una forma correcta de hacer esto?

He examinado el uso de setAnimationDidStopSelector de UIView: sin embargo, en los documentos parece que solo se aplica cuando se usa dentro de un bloque de animación UIView (beginAnimations y commitAnimations). También lo intenté por si acaso, pero no parece funcionar.

Aquí hay algunos ejemplos de código (esto está dentro de un método de subclase UIView personalizado):

// 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 solución que estaba considerando que debería funcionar, pero no parece ser la mejor manera, es usar el NDSbject''s performSelector: withObject: afterDelay :. Siempre que establezca el retraso igual a la duración de la animación, entonces debería estar bien.

¿Hay alguna manera mejor? ¡Gracias!


O puedes adjuntar tu animación con:

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

Y establece el bloque de finalización para manejar lo que necesitas hacer.


Swift 3 sintaxis para esta answer .

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