2010-12-09 10 views
5

¿Alguien ahora cómo puedo animar varias capas al mismo tiempo usando CAKeyframeAnimation? Cada capa tiene su propio objeto CAKeyframeAnimation. Echar un vistazo al siguiente código:CAKeyframeAnimation múltiple en diferentes capas al mismo tiempo

tengo un método que recibe un objeto, crea la CAKeyframeAnimation y se une la animación a la misma:

- (void)animateMovingObject:(CALayer*)obj 
       fromPosition:(CGPoint)startPosition 
       toPosition:(CGPoint)endPosition 
        duration:(NSTimeInterval)duration { 
    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
    pathAnimation.calculationMode = kCAAnimationPaced; 
    //pathAnimation.fillMode = kkCAFillModeRemoved; // default 
    //pathAnimation.removedOnCompletion = YES; // default 
    pathAnimation.duration = duration; 

    // create an empty mutable path 
    CGMutablePathRef curvedPath = CGPathCreateMutable(); 

    // set the starting point of the path 
    CGPathMoveToPoint(curvedPath, NULL, startPosition.x, startPosition.y); 

    CGPathAddCurveToPoint(curvedPath, NULL, 
          startPosition.x, endPosition.y, 
          startPosition.x, endPosition.y, 
          endPosition.x, endPosition.y); 
    pathAnimation.path = curvedPath; 
    [obj addAnimation:pathAnimation forKey:@"pathAnimation"]; 
    CGPathRelease(curvedPath); 
} 

Ahora, supongamos que tengo 3 capas añaden como una subcapa de mi juego de mesa y yo hacemos las siguientes llamadas:

CALayer obj1 = ... // set up layer and add as sublayer 
[self animateMovingObject:obj1 
      fromPosition:CGPointMake(0.0, 0.0) 
       toPosition:CGPointMake(100.0, 100.0) 
       duration:2.0]; 

CALayer obj2 = ... // set up layer and add as sublayer 
[self animateMovingObject:obj2 
      fromPosition:CGPointMake(0.0, 0.0) 
       toPosition:CGPointMake(150.0, 100.0) 
       duration:2.0]; 

CALayer obj3 = ... // set up layer and add as sublayer 
[self animateMovingObject:obj3 
      fromPosition:CGPointMake(0.0, 0.0) 
       toPosition:CGPointMake(200.0, 100.0) 
       duration:2.0]; 

al hacer esto, puedo ver sólo el obj3 se mueva de la posición (0.0, 0.0) a (200.0, 100.0). ¿Qué me estoy perdiendo? ¿Debo usar NSOperationQueue/Threads? El uso del método delegado animationDidStart: de CAKeyframeAnimation no parece ser útil en este contexto.

¿Alguna idea?

Gracias de antemano.

Respuesta

4

Si desea agrupar una serie de animaciones de este tipo, por lo que están garantizados para ser sincronizado, se puede envolver en una CATransaction:

[CATransaction begin]; 
[CATransaction setValue:[NSNumber numberWithFloat:2.0] forKey:kCATransactionAnimationDuration];  

// Do animations 

[CATransaction commit];  

Sin embargo, no estoy seguro de por qué la el código que ha escrito no activa las animaciones correctas para cada capa, incluso si no están sincronizadas.

Tenga en cuenta que al establecer removedOnCompletion en SÍ, su animación se ejecutará y luego el objeto volverá a su punto de inicio al final. Probablemente quieras que sea NO.

+0

Gracias por responder Brad. Aunque la posición de inicio/final de la animación no es mi problema, usted hizo buenas observaciones. En mi caso, eliminé OnCompletion = YES de forma redundante (es el valor predeterminado). Mis pasos con respecto a esto son: 1) establecer la posición de la capa a su posición final; 2) calcule la posición inicial/final de la animación por separado (en la cual la posición final de la animación es la posición actual de la capa). También dejé 'fillMode' en su valor predeterminado (kCAFillModeRemoved). Mi problema no es la posición de las capas durante/después de las animaciones, tiene que ver con las animaciones secuenciales. –

+1

Si configuro la propiedad de delegado de las tres animaciones, observo en la devolución de llamada delegada 'animationDidStop: finished:' que las primeras 2 animaciones llaman a este método con el argumento 'finished = NO', y el último (que corresponde al capa que veo que está siendo animada) get's 'finished = YES'. Esto tiene sentido para lo que veo, pero me pregunto qué es lo que detiene mis animaciones. No estoy llamando a ningún método de 'detención' en mi código, solo llamo a los métodos 'animateMovingObject: ..' tres veces de forma secuencial. Gracias –

+0

Edito mi pregunta con las "actualizaciones", aunque el problema todavía ocurre. –

Cuestiones relacionadas