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()