2010-07-13 16 views
36

He conectado los dos métodos a continuación para separar botones en mi interfaz de usuario, pero he notado que después de presionar el botón "VERSIÓN 1" no podía presionar el botón hasta que la duración de la animación dentro del método había terminado. Según entendí, la animación usa su propio hilo para no bloquear la aplicación principal.does animateWithDuration: animations: block main thread?

// VERSION 1 
-(IBAction)fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 animations:^{ 
     [myLabel setAlpha:0.0]; 
    }]; 
} 

La versión más viejo estilo (abajo) sí permite el botón para ser reprimida antes de que termine el temporizador de animación, sólo tiene que reiniciar el temporizador para empezar de nuevo. Si ambos funcionan igual, ¿me estoy perdiendo algo o ha habido un cambio en la operación entre 3.2 y 4?

// VERSION 2 
-(IBAction)fadeUsingOld { 
    NSLog(@"V2: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.5]; 
    [myLabel setAlpha:0.0]; 
    [UIView commitAnimations]; 
} 

Saludos Gary

Respuesta

86

La animación con bloques no bloquea el hilo principal. Creo que el comportamiento que está viendo se debe a que, de forma predeterminada, la interacción del usuario está desactivada la animación de duración con las nuevas llamadas al bloque. Puede anular esta pasando UIViewAnimationOptionAllowUserInteraction (llamando animationWithDuration:delay:options:animations:completion), así:

-(IBAction) fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         [myLabel setAlpha:0.0]; 
        } 
        completion:nil]; 
} 
+2

Ah que tiene sentido, me había perdido esa opción en la documentación, voy a mirar hacia arriba. Muchas gracias, muy apreciado. – fuzzygoat

+1

Gracias por esto. Maldita sea, esto me estaba molestando. De hecho, es bastante molesto que no esté activado de manera predeterminada, porque dice que bloquea la interacción con la vista que se anima, ¡pero de hecho bloquea toda la interfaz de usuario! – runmad

+0

Hombre, no sería bueno si esto se solucionara en el próximo iOS 5.0 ...

1

Para animateWithDuration :, la referencia de clase no dice nada acerca de roscar, así que no estoy seguro.

Para beginAnimations:context: and commitAnimation:, sí, se ejecutan en un subproceso diferente UIView class Reference.

Algunos de los cambios de propiedad para ver objetos se pueden animar; por ejemplo, establecer el marco, los límites, el centro y las propiedades de transformación. Si cambia estas propiedades en un bloque de animación, los cambios del estado actual al nuevo se animan. Invoque el método beginAnimations: context: class para comenzar un bloque de animación, establezca las propiedades que desea animar y luego invoque el método de clase commitAnimations para finalizar un bloque de animación. Las animaciones se ejecutan en un hilo separado y comienzan cuando la aplicación regresa al ciclo de ejecución. Otros métodos de clase de animación le permiten controlar la hora de inicio, la duración, el retraso y la curva de las animaciones dentro del bloque.

Cuestiones relacionadas