2012-07-24 11 views
6

I estoy separando la pantalla en pequeños azulejos, a continuación, la animación de cada baldosa para llevar a cabo una transición:múltiple CALayers Animación - Llenar Modo

for (int x=0; x<number_of_x_splits; x++) { 

    for (int y=0; y<number_of_y_splits; y++) { 

     CGSize splitSize = CGSizeMake(screenBounds.width/number_of_x_splits, screenBounds.height/number_of_y_splits); 

     CATransformLayer *transformLayer = [CATransformLayer layer]; 
     [transformLayer setFrame:CGRectMake(splitSize.width * x, splitSize.height * y, splitSize.width, splitSize.height)]; 
     [transformLayer setPosition:CGPointMake((splitSize.width * x) + splitSize.width/2, (splitSize.height * y) + splitSize.height/2)]; 

     ... adding some sublayers to transformLayer... 

     CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"]; 
     [rotate setDuration:5.0]; 
     [rotate setFromValue:[NSNumber numberWithFloat:0]]; 
     [rotate setToValue:[NSNumber numberWithFloat:M_PI]]; 
     [rotate setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
     [rotate setTimeOffset:(1/(number_of_x_splits + number_of_y_splits)) * (x+y)]; 
     [rotate setFillMode:kCAFillModeForwards]; 
     [rotate setRemovedOnCompletion:NO]; 
     [transformLayer addAnimation:rotate forKey:@"transform.rotation.y"]; 

    } 
} 

El problema es que sólo la última CALayer en la cadena permanece en la posición final. También han tratado de establecer el valor de transformación CALayer definitiva:

[transformLayer setTransform:CATransform3DMakeRotation(M_PI, 0, 1, 0)]; 

supongo que tiene que ver con la creación de otra instancia de CALayer en el bucle de restablecer las propiedades de la capa anterior.

¿Alguien tiene alguna sugerencia de cómo remediar la situación?

Respuesta

6

timeOffset no es la propiedad que desea utilizar, que realmente cambia en qué punto de la animación se iniciará y no la demora hasta que se inicia. En su lugar, debe establecer beginTime de la animación.

Recuerde que el tiempo de comenzar debe ser CACurrentMediaTime() + yourDelay


La diferencia entre timeOffset y beginTime se puede ilustrar como este. Sé que he visto esta ilustración antes, simplemente no pude encontrarla.

Normal animation | 12345678 | 
Begin time   |  12345678 | 
Time offset   | 5678  | 
+0

Indeed !! Eso lo soluciona Sin TimeOffset a partir de ahora! ¡Muchas gracias! – Nimrod7

+2

beginTime debe ser CACurrentMediaTime() + yourDelay a menos que la animación sea parte de un grupo de animación. En ese caso, usa 0 como valor de tiempo base, comenzando al principio del grupo de animación principal. –

+0

@DuncanC muy buen punto. –

Cuestiones relacionadas