2010-11-09 7 views
5

Experimento un problema extraño con los bloques de animación de iPhone. Este código :UIView animateWithDuration: retraso: trabajando raro

[UIView animateWithDuration:2 delay: 0 options: 0 animations: 
^(void) { [controller setBackgroundColor: [UIColor blueColor]]; } 
completion: nil]; 

[UIView animateWithDuration:2 delay: 2 options: 0 animations: 
^(void) { [controller setBackgroundColor: [UIColor redColor]]; } 
completion: nil]; 

establece de forma instantánea el fondo de color rojo, sin pasar por el estado azul. Lo mismo incluso para este código:

[UIView animateWithDuration:2 delay: 0 options: 0 animations: 
^(void) { [controller setBackgroundColor: [UIColor blueColor]]; } 
completion: 

^(BOOL wrwg) { 
    [UIView animateWithDuration:2 delay: 2 options: 0 animations: 
    ^(void) { [controller setBackgroundColor: [UIColor redColor]]; } 
    completion: nil]; 
}]; 

Es decir, cuando trato de ejecutar la segunda animación DESPUÉS de que el primero ha terminado. ¿Cuál es el problema?

+0

¿Qué tipo de objeto es el controlador? Una UIView, UILabel, otra? – Anna

Respuesta

3

sólo tenía este problema, y ​​comúnmente tienen. Hay dos causas, aunque una es algo que todavía tengo que probar.

Causa uno, olvidé conectar el constructor de interfaz a la vista animada, por lo que el bloque dijo "Animate on nil? No hay nada que hacer, ¡así que voy a saltar al bloque de finalización!"

La otra causa es que hay algo que hacer, pero no es una propiedad animable (Oculto), y apostaría a que el bloque de finalización se llama tan pronto como las variables en la animación coincidan con "a" o " estado final. Es solo una teoría, pero apuesto a que es un hilo separado que se ejecuta a un cierto ritmo con: if (currentValueOfProperty = finalValue) doCompletion(). (perdón el pseudo código).

Alguien probablemente debería probar que, aunque

5

Propiedad backgroundColor es NO animada en UIView. En su lugar, utilice backgroundColor propiedad de la capa de la vista:

#import <QuartzCore/QuartzCore.h> // don't forget to link this library in project settings 

[UIView animateWithDuration:2.0 
         delay:0.0 
        options:UIViewAnimatingOptionBeginFromCurrentState 
       animations:^(void){ 
        controller.layer.backgroundColor = [UIColor blueColor].CGColor; 
       } 
       completion:NULL]; 

P. S. Como se señaló en publicaciones anteriores, asegúrese de que su controller se hereda de UIView. Si se hereda de UIViewController, use controller.view en su lugar.

Cuestiones relacionadas