2012-05-02 7 views
15

Non ho mai dato alcun pensiero per la tornata BOOL finished di un gestore di completamento UIView animazione, ma leggendo alcuni esempi di codice nella Guida di Apple UIView programmazione mostra questo:E 'necessario testare il BOOL finito in un gestore di completamento per l'animazione UIView?

completion:^(BOOL finished) { 
if (finished) { 

è necessario? Il blocco di completamento non dovrebbe essere eseguito a meno che l'animazione non sia finita comunque, giusto? Il test sembra ridondante.

risposta

7

L'azione effettiva intrapresa in quello snippet di codice è piuttosto significativa. L'animazione sta passando da una vista all'altra - la prima viene sostituita, quindi un booleano è impostato per tenere traccia di quale è attualmente visualizzata. Il booleano è impostato nel blocco di completamento.

[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView) 
    toView:(displayingPrimary ? secondaryView : primaryView) 
    duration:1.0 
    options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight : 
       UIViewAnimationOptionTransitionFlipFromLeft) 
    completion:^(BOOL finished) { 
     if (finished) { 
      displayingPrimary = !displayingPrimary; 
     } 
}]; 

In questo caso, se l'animazione (per qualsiasi motivo) non completa, quindi il punto di vista non sono stati scambiati, e che assolutamente non vuole capovolgere il valore di displayingPrimary, perché' Avremo quindi una registrazione inaccurata del tuo stato. Ecco perché in questo caso viene selezionato il flag finished.

Si noti che nella maggior parte (se non tutti) degli altri esempi di codice in tale guida, il flag non è selezionato, perché in questi casi non è significativo (eseguendo un'altra animazione dopo la prima, ad es., O cambiando un certo valore che non corrisponde a dipende dal completamento riuscito dell'animazione).

+2

quindi sembra che un blocco di completamento possa essere eseguito anche se il bool finito è zero. perché dovrebbe succedere? poiché si tratta di un blocco di "completamento", non funzionerebbe solo se il blocco precedente fosse effettivamente completato? – johnbakers

+1

Avvio di una nuova animazione con uno di questi metodi, c'è un'opzione per fare in modo che il nuovo interrompa il primo. C'è anche un'opzione per consentire l'interazione dell'utente con la vista, che può presentare un'opportunità per annullare l'animazione. –

+0

Secondo doc la transizioneFromView aggiunge il toView all'INIZIO dell'animazione e ottieni daView fuori da superView alla fine dell'animazione. Significa che se finito è falso di ENTRAMBI fromView e toView è ancora lì? Perché nei miei casi ho visto casi in cui entrambi sono spariti. –

3

Sì, davvero dovresti onorare quel bool nel tuo gestore. L'utente può avviare l'animazione, ma prima che l'animazione venga completata normalmente, l'utente fa qualcos'altro per annullarla anticipatamente. Questo bool ti fa sapere di questi casi.

- update - Solo per elaborare. Immagina qualche animazione che sposta una vista sullo schermo. Il conduttore potrebbe sparare quando la vista è in movimento. Supponiamo che l'utente tocchi qualcos'altro per causare una nuova animazione che annulla essenzialmente la prima in corso. Potresti usare il bool fornito per rilevarlo.

+0

Stai suggerendo che anche se l'animazione è stata annullata, il gestore di completamento potrebbe ancora funzionare? – johnbakers

+0

Spero che qualcuno possa sentirsi più sicuro di me, ma sì, penso che sia così. Non cancellato prima che venga mai eseguito, ma interrotto prima che possa essere completato. –

+0

Il blocco di completamento ha solo un significato e dovresti convalidarlo e usarlo solo se devi fare qualcosa di specifico dopo che l'animazione è stata completata con successo. Se non ti interessa cosa succede con l'animazione, allora non ha senso convalidare se l'animazione è stata completata con successo ... – Lefteris

Problemi correlati