2012-04-01 3 views
7

Ho sempre pensato che Core Animation eseguisse animazioni sullo sfondo. Quando ho eseguito questo codice, le mie interazioni UI sono bloccati fino al termine di animazione:Perché è -animateWithDuration: ritardo: opzioni: animazioni: completamento: blocco dell'interfaccia utente?

[UIView animateWithDuration:4.5 
         delay:0 
        options:options 
       animations:^{ 
        oldView.alpha = 0; 
        newView.alpha = 1; 
       } 
       completion:^(BOOL finished) { 
        if (finished) { 
         [oldView removeFromSuperview]; 
        } 
       }]; 

Come si può vedere la durata è lungo quindi è chiaramente visibile che le interazioni dell'interfaccia utente sono bloccate mentre l'animazione.

L'interazione dell'interfaccia utente inizia a essere bloccata all'avvio dell'animazione e termina per essere bloccata al termine dell'animazione.

C'è un modo per avviare contemporaneamente un'animazione UIView in modo che le interazioni dell'interfaccia utente non siano bloccate?

EDIT per chiarire: So che l'interfaccia utente è bloccato perché non posso interagire con qualsiasi controllo sullo schermo perché questa animazione è in esecuzione. Questi altri controlli non sono correlati a ciò che viene animato e non si trovano sullo stesso ramo nella gerarchia della vista. L'intera interfaccia utente viene bloccata quando viene eseguita questa animazione. Quando lo imposto su 10 secondi, l'interfaccia utente viene bloccata per 10 secondi mentre viene eseguita l'animazione. Testato con iOS 4.2 su iPhone 4.

+0

Come fai a sapere che è bloccato? A meno che una vista non abbia un alfa pari a zero, tutte le viste dietro di essa hanno un'interazione disabilitata. – CodaFi

+0

Aggiornamento della domanda con chiarimenti. –

risposta

18

Guardando la documentazione per UIView, ho trovato questo nella sezione di discussione per tale metodo:

Durante un'animazione, le interazioni degli utenti sono temporaneamente disabilitate per i punti di vista di essere animati. (Prima di iOS 5, le interazioni dell'utente sono disabilitate per l'intera applicazione.) Se si desidera che gli utenti siano in grado di interagire con le viste, includere la costante UIViewAnimationOptionAllowUserInteraction nel parametro options.

Quindi, se si desidera continuare a consentire l'interazione dell'utente, è necessario impostare questa costante nel parametro opzioni.

5

documentazione è tuo amico :)

UIView Class Reference

Sotto animateWithDuration: animazioni:

"Durante un'animazione, le interazioni dell'utente vengono temporaneamente sospeso per il viste che sono animate. (Prima di iOS 5, le interazioni dell'utente sono disabilitate per l'intera applicazione.) "

E, naturalmente, per tutte le v Iews sotto la vista animata.

+1

Come potrei averlo perso !!! Mucca sacra. Ho bisogno di occhiali più grandi. Grazie. –

+0

prova il metodo di jmstone con 'UIViewAnimationOptionAllowUserInteraction' - spero che faccia il trucco :) –

+1

ha fatto totalmente il trucco. Salvato il mio anno. Grande. –