2012-04-01 14 views
7

Siempre pensé que Core Animation realiza animaciones en el fondo. Cuando ejecuta este código, mis interacciones de interfaz de usuario se bloquean hasta que finalice la animación:¿Por qué es -animateWithDuration: delay: options: animations: completion: blocking the UI?

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

Como se puede ver la duración es larga por lo que es claramente visible que las interacciones de interfaz de usuario están bloqueados, mientras que la animación.

La interacción de la interfaz de usuario comienza a bloquearse cuando comienza la animación y finaliza para bloquearse cuando finaliza la animación.

¿Hay alguna manera de iniciar una animación UIView simultáneamente para que las interacciones de la interfaz de usuario no estén bloqueadas?

EDIT para aclarar: sé que la interfaz de usuario está bloqueada porque no puedo interactuar con ningún control en la pantalla por qué esta animación se está ejecutando. Esos otros controles no están relacionados con lo que se está animando y no están en la misma rama en la jerarquía de vista. Toda la interfaz de usuario se bloquea cuando se ejecuta esta animación. Cuando lo ajusto a 10 segundos, la IU se bloquea durante 10 segundos mientras se ejecuta la animación. Probado con iOS 4.2 en el iPhone 4.

+0

¿Cómo sabes que está bloqueado? A menos que una vista tenga un alfa de cero, todas las vistas detrás de ella tienen una interacción deshabilitada. – CodaFi

+0

Actualizó la pregunta con una aclaración. –

Respuesta

18

En cuanto a la documentación de UIView, encontré esto en la sección de discusión de ese método:

Durante una animación, las interacciones del usuario se desactivan temporalmente por las vistas que se está animando. (Antes de iOS 5, las interacciones del usuario están deshabilitadas para toda la aplicación). Si desea que los usuarios puedan interactuar con las vistas, incluya la constante UIViewAnimationOptionAllowUserInteraction en el parámetro de opciones.

Por lo tanto, si desea que la interacción con el usuario continúe permitida, debe establecer esta constante en el parámetro de opciones.

5

documentación es su amigo :)

UIView Class Reference

Bajo animateWithDuration: animaciones:

"Durante una animación, las interacciones del usuario se desactivan temporalmente para el vistas animadas. (Antes de iOS 5, las interacciones del usuario están deshabilitadas para toda la aplicación). "

Y por supuesto, para vistas bajo la vista animada.

+1

¡Cómo podría haberme perdido eso! Santa vaca Necesito gafas más grandes. Gracias. –

+0

prueba el método de jmstone con 'UIViewAnimationOptionAllowUserInteraction' - espero que sea el truco :) –

+1

fue el truco. Guardado mi año. Estupendo. –

Cuestiones relacionadas