2009-09-21 4 views
5

Aggiungo alcune animazioni di base a un gioco di carte su cui sto lavorando. (La mia prima app per iPhone.)Modifica di una vista contenitore animazione iPhone prima di avviare l'animazione

Sto creando una classe UIView personalizzata "AnimationContainer", che gira da image1 a image2, passando da rect1 a rect2. La mia ultima intenzione è di avere fino a quattro di questi contenitori che eseguono le loro transizioni contemporaneamente.

Il problema che sto avendo è che l'animazione non mostra immagine1 ... quindi appare solo l'ultima metà della transizione di flip.

Tuttavia, se ripristino l'animazione prima toccando Ripristina, allora tutto funziona perfettamente. In altre parole, se premo Flip ancora e ancora, ottengo solo metà della transizione ... ma se premo Inizialmente Reset, allora tutto funziona perfettamente per un flip.

Quindi, come posso ripristinare correttamente l'animazione?

Di seguito è riportato il codice, uno screenshot, ed ecco un collegamento completo: Project Zip File 700k.

alt text http://www.robsteward.com/cardflip.jpg

- (void)displayWithImage1 {  //RESET button calls this 
    self.frame = rect1; 
    [image2 removeFromSuperview]; 
    [self addSubview:image1]; 
    [self setNeedsDisplay]; //no help: doesn't force an update before animation 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; //<---this is what the reset button calls 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

Grazie!

+0

Ho trovato una mezza soluzione brutta. Ho aggiunto un'animazione "fittizia" e ho reso la mia classe un delegato per il suo setAnimationDidStopSelector. L'animazione fittizia ha una durata di 0.0 e sposta semplicemente la vista su rect1. Quando viene chiamato il selettore di stop del manichino, faccio il codice di virgola animato "reale" dall'alto. Completamente funzionale, e sembra che almeno 4 possano funzionare contemporaneamente. Sì, io. LOL – Rob

+1

Risulta che la soluzione alternativa può produrre fino a mezzo secondo di ritardo, quindi sto iniziando una taglia. Ci deve essere un modo per inviare a un container visualizzare due immagini e girarle da una alla successiva in un'unica transizione. – Rob

risposta

12

È necessario un ciclo di disegno da passare per ridisegnare la vista prima di eseguire l'animazione. Questo codice è un esempio di "disegnare questo, e quando arriva il prossimo ciclo di eventi, fai quest'altra cosa". Non è raro fare questo nel codice dell'interfaccia utente. La tua prima soluzione è tentare la stessa cosa, ma in un modo molto più complicato.

- (void)_runTheAnimation { 
    // Moved here from -runTheAnimation 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; 
    [self performSelector:@selector(_runTheAnimation) withObject:nil afterDelay:0.0]; 
} 
+1

Fantastico! Grazie mille. Non ero affatto chiaro che i selettori non siano stati eseguiti immediatamente. Tutto funziona alla grande ora. La taglia da 200 rep era un piccolo prezzo da pagare. Ho passato 10 ore a scherzare con questo. – Rob

+1

I selettori vengono inviati immediatamente se richiesto (-peformSelector :) Il metodo sopra riportato è -performSelector: withObject: afterDelay :, che pianifica sul runloop per il selettore da inviare in un determinato momento in futuro. Un ritardo di 0 significa effettivamente "la prossima volta che il ciclo di esecuzione itera". Gli stessi selettori descrivono semplicemente un messaggio da passare a un oggetto. L'atto di passare quel messaggio è fatto dai metodi performSelector .... –

+1

Cool, penso di aver capito. Continua ad andare al passo con Cocoa, Objective-C e tutto l'iPhone ... ma ora sto imparando più velocemente. Grazie ancora. – Rob