2010-01-22 9 views
8

Tengo dos animaciones que estoy tratando de realizar en un UILabel en el iPhone con sistema operativo 3.1.2. La primera mece la UILabel de ida y vuelta:Agrupar dos animaciones principales con CAAnimationGroup hace que una CABasicAnimation no se ejecute

CAKeyframeAnimation *rock; 
rock = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 
[rock setBeginTime:0.0f]; 
[rock setDuration:5.0]; 
[rock setRepeatCount:10000]; 

NSMutableArray *values = [NSMutableArray array]; 
MovingMath *math = [[MovingMath alloc] init]; 

// Center start position 
[values addObject:[math DegreesToNumber:0]]; 

// Turn right 
[values addObject:[math DegreesToNumber:-10]]; 

// Turn left 
[values addObject:[math DegreesToNumber:10]]; 

// Re-center 
[values addObject:[math DegreesToNumber:0]]; 

// Set the values for the animation 
[rock setValues:values]; 

[math release]; 

El segundo se acerca el UILabel de modo que se hace más grande:

NSValue *value = nil; 
CABasicAnimation *animation = nil; 
CATransform3D transform; 
animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
transform = CATransform3DMakeScale(3.5f, 3.5f, 1.0f); 
value = [NSValue valueWithCATransform3D:transform]; 
[animation setToValue:value]; 
transform = CATransform3DMakeScale(1.0f, 1.0f, 1.0f); 
value = [NSValue valueWithCATransform3D:transform]; 
[animation setFromValue:value]; 
[animation setAutoreverses:YES]; 
[animation setDuration:30.0f]; 
[animation setRepeatCount:10000]; 
[animation setBeginTime:0.0f]; 

Adición de cualquiera de estas animaciones directamente a la capa de la UILabel funciona como se espera.

Sin embargo, si trato de agrupar las animaciones juntos, la primera "balanceo" de animación no funciona:

CAAnimationGroup *theGroup = [CAAnimationGroup animation]; 

theGroup.duration = 5.0; 
theGroup.repeatCount = 10000; 
theGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
theGroup.animations = [NSArray arrayWithObjects:[self rockAnimation], [self zoomAnimation], nil]; // you can add more 

// Add the animation group to the layer 
[[self layer] addAnimation:theGroup forKey:@"zoomAndRotate"]; 

El orden de la adición de las animaciones para el grupo no importa. En lugar de hacer zoom, de la manera anterior, intenté cambiar los límites, pero tampoco fue exitoso. Cualquier idea sería muy apreciada. Gracias.

+0

Para tener en cuenta mi comentario a continuación ... Quiero que estas animaciones sucedan al mismo tiempo. El problema es que al usar el grupo, RockAnimation no se ejecuta; solo zoomAnimation se ejecuta. – Christian

Respuesta

8

Está intentando animar simultáneamente dos cambios en una propiedad, la transformación de su CALayer. En la primera animación, está utilizando un keypath auxiliar para cambiar la transformación para producir una rotación, y en el segundo está cambiando la transformación directamente para producir una escala. La segunda animación sobrescribe la primera porque estás construyendo transformaciones enteras que solo se escalan y animan entre ellas.

Parece que puede provocar que se produzca la escala y la rotación de la capa mediante el uso de rutas clave de ayuda para ambas animaciones. Si cambia el código en la animación de escala para leer

CABasicAnimation *animation = nil; 
animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
[animation setToValue:[NSNumber numberWithDouble:3.5]]; 
[animation setFromValue:[NSNumber numberWithDouble:1.0]]; 
[animation setAutoreverses:YES]; 
[animation setDuration:30.0f]; 
[animation setRepeatCount:10000]; 
[animation setBeginTime:0.0f]; 

usted debe ser capaz de tener tanto de balanceo y la ampliación de su capa.

+0

¡Gracias, eso funcionó! – Christian

+0

Tengo exactamente el mismo problema, pero no funciona para mí en iPad 3.2. Intento acceder a la propiedad de rotación y escala, pero la animación agrupada se detiene inmediatamente después de algunos milisegundos y las capas vuelven a su lugar. – brutella

2

Creo que CAAnimationGroup no es lo que quieres. A partir de la documentación para CAAnimationGroup:

CAAnimationGroup permite múltiples animaciones a agruparse y ejecutar simultáneamente. Las animaciones agrupadas se ejecutan en el espacio de tiempo especificado por la instancia CAAnimationGroup .

Parece que no desea que sus animaciones se ejecuten al mismo tiempo, sino secuencialmente. Puede haber formas más sencillas de hacerlo, pero he encontrado que confiar en el método animationDidStop:finished: funciona bien. Para hacer esto, cree su primera animación y configure su delegado a un objeto que implementará el método animationDidStop:finished:, y agregue la animación como normal (sin utilizar CAAnimationGroup). En el método:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
{ 
    // Create the second animation and add it 
} 
+0

Quiero que esto suceda al mismo tiempo. El problema es que al usar el grupo, RockAnimation no se ejecuta. Solo se ejecuta zoomAnimation. – Christian

+0

La duración de las animaciones agrupadas no se ajusta a la duración de su CAAnimationGroup. En cambio, las animaciones se recortan a la duración del grupo de animación. Es posible que desee intentar ejecutar todas sus animaciones en 5 segundos (y eliminar repeatCounts) para ver si ese es el problema. –

+0

Desafortunadamente eso tampoco funcionó. – Christian

Cuestiones relacionadas