5

Sto provando a creare un semplice gioco Simon (una sequenza crescente di colori lampeggia e l'utente deve provare a ripetere quella sequenza). Il modo in cui lo sto facendo è di avere 4 UIViews con 8 immagini. Quindi c'è un UIView per rosso, blu, verde e giallo. E ho gif di verde scuro, verde chiaro, rosso scuro, rosso chiaro, ecc.ogg-c: esecuzione di più blocchi di animazione transitionWithView

Quindi nel mio codice, sto usando il blocco di animazione di transizioneWithView di UIView: L'immagine di UIView imageView.image è impostata di default sull'immagine a colori scuri e questo blocco sta passando a un'immagine di colore chiaro, e alla fine torna all'immagine a colori scuri (per dargli un aspetto "illuminante").

- (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]; 
        } 
       }]; 
} 

Questo funziona correttamente quando lo chiamo il metodo con questo codice con un colore.

Il problema è, diciamo che ho un NSArray o colori che voglio animare in sequenza. Quindi se il mio array era "blu", "verde" vorrei che la transizioneWithView venisse chiamata usando il blu, animando la vista blu, quindi animando la vista verde. Al momento, animerà la vista verde e la vista blu contemporaneamente.

Sto provando a giocare con NSTimer in questo momento, ma non ho molta fortuna con quello.

Qualsiasi consiglio là fuori sarebbe molto apprezzato.

risposta

3

OK, quindi dopo aver giocato un po '/ un po' ho trovato una soluzione. In primo luogo, ho cambiato il transitionWithView a guardare come questo:

[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 
              } 
             } 
         ]; 
        } 
       } 
]; 

Il grande cambiamento di cui sopra stava rimuovendo l'UIViewAnimationOptionAutoreverse originale che ho avuto, e aggiungere l'animazione di andare dall'immagine luce all'immagine scura nel blocco di completamento.

Poi per chiamare il metodo di cui sopra (animateColor :), ho scorrere un array e utilizzare un selettore eseguire con un crescente afterDelay:

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

Ho avuto un problema simile quando ho cercato di eseguire più transizioni consecutivamente . L'ho risolto impostando semplicemente una variabile di stato all'interno del blocco di completamento. Quindi questa variabile di stato abilita la condizione per la prossima transizione. Ebbene, dal momento che sto utilizzando un timer con un metodo runloop il mio lavoro era più facile qui:

- (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; }]; 
    } 
} 

questo modo è possibile fare decine di transizioni senza perdersi in blocchi annidati.