5

Estoy tratando de hacer un simple juego de Simon (una secuencia creciente de colores parpadea y el usuario tiene que intentar repetir esa secuencia). La forma en que lo hago es teniendo 4 UIViews con 8 imágenes. Entonces, hay una UIView para rojo, azul, verde y amarillo. Y tengo gifs de color verde oscuro, verde claro, rojo oscuro, rojo claro, etc.objetivo-c: ejecutar múltiples bloques de animación transitionWithView

Así que en mi código, estoy usando el bloque de animación transitionWithView de UIView: El UIView imageView.image está predeterminado en la imagen de color oscuro y este bloque está en transición a una imagen de color claro, y al finalizar regresa a la imagen de color oscuro (para darle un aspecto de "encendido").

- (void) animateColor:(NSString *)color 
{ 
    ... 
    //do stuff to default the dark and light image name and which UIView to animate based on the color parameter 
    ... 
    [UIView transitionWithView:imageView 
        duration:.5 
        options: UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAutoreverse 
       animations:^{ 
        imageView.image = [UIImage imageNamed:lightImage]; 
       } 
       completion:^(BOOL finished){ 
        if (finished){ 
         imageView.image = [UIImage imageNamed:darkImage]; 
        } 
       }]; 
} 

Esto funciona bien cuando lo llamo el método de este código con un solo color.

El problema es, digamos que tengo un NSArray o colores que deseo animar secuencialmente. Entonces, si mi matriz era "azul", "verde", me gustaría que se llamara a la transiciónWithView con azul, animé la vista azul y luego animé la vista verde. En este momento, animará la vista verde y la vista azul al mismo tiempo.

Estoy tratando de jugar con NSTimer en este momento, pero no tengo mucha suerte con eso.

Cualquier consejo que se agradezca.

Respuesta

3

Bien, así que después de jugar un poco encontré una solución. En primer lugar, me cambió el transitionWithView a tener este aspecto:

[UIView transitionWithView:imageView 
        duration:1 
        options: UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        imageView.image = [UIImage imageNamed:lightImage]; 
       } 
       completion:^(BOOL finished){ 
        if (finished){ 
         [UIView transitionWithView:imageView 
              duration:1 
              options:UIViewAnimationOptionTransitionCrossDissolve 
             animations:^{ 
              imageView.image = [UIImage imageNamed:darkImage]; 
             } 
             completion:^(BOOL done){ 
              if (done){ 
               // Do some program upkeep logic 
              } 
             } 
         ]; 
        } 
       } 
]; 

El gran cambio anterior fue la eliminación de la UIViewAnimationOptionAutoreverse original que tenía, y añadir la animación para pasar de la imagen de luz a la imagen oscura en el bloque de terminación.

Entonces para llamar al método anterior (animateColor :), I bucle a través de una matriz y utilizar un selector realizar con un afterDelay creciente:

for (NSString *color in self.randomPattern.patternArray) { 
     [self performSelector:@selector(animateColor:) withObject:color afterDelay:1.5*self.counter]; 
     ++self.counter; 
    } 
5

I tenían un problema similar cuando traté de ejecutar múltiples transiciones consecutivamente . Lo resolví simplemente configurando una variable de estado dentro del bloque de finalización. Entonces esta variable de estado habilita la condición para la próxima transición. Bueno, ya que estoy usando un temporizador con un método runloop mi trabajo era más fácil aquí:

- (void) runloop { 

    static int step = 1; 

    if (step == 1) 
    { 
     step = 0; 
     [UIView transitionWithView:imageView 
          duration:1 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ imageView.image = [UIImage imageNamed:lightImage]; } 
         completion:^(BOOL finished){ step = 2; }]; 
    } 

    if (step == 2) 
    { 
     step = 0; 
     [UIView transitionWithView:imageView 
          duration:1 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ imageView.image = [UIImage imageNamed:darkImage]; } 
         completion:^(BOOL finished){ step = 0; }]; 
    } 
} 

esta manera se puede hacer docenas de transiciones sin perderse en bloques anidados.

Cuestiones relacionadas