2010-11-09 14 views
5

Ho riscontrato uno strano problema con i blocchi di animazione di iPhone. Questo codice:UIView animateWithDuration: ritardo: funzionamento strano

[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]; 

imposta istantaneamente lo sfondo rosso, senza passare lo stato blu. La stessa cosa anche per questo codice:

[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]; 
}]; 

cioè, dove provo a fare funzionare la seconda animazione dopo il primo è terminato. Qual è il problema?

+0

Che tipo di oggetto è il controller? Un UIView, UILabel, altro? – Anna

risposta

3

Ho appena avuto questo problema, e ho comunemente averlo. Ci sono due cause, sebbene uno sia qualcosa che devo ancora provare.

Causa uno, ho dimenticato di collegare il generatore di interfacce alla vista animata, quindi il blocco diceva "Animare su zero? Non c'è niente da fare, quindi salterò al blocco di completamento!"

L'altra causa è, c'è qualcosa da fare, ma non è una proprietà animabile (Nascosto), e scommetto che il blocco di completamento viene chiamato non appena le variabili nell'animazione corrispondono al loro "a" o " fine "stato. È solo una teoria, ma scommetto che è un thread separato che esegue ad un certo ritmo con: if (currentValueOfProperty = finalValue) doCompletion(). (scusate lo pseudo codice).

Qualcuno dovrebbe probabilmente verificare che, anche se

5

Proprietà backgroundColor è NON animato in UIView. Invece, utilizzare backgroundColor di proprietà dello strato della 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. Come indicato nei post precedenti, assicurati che il tuo controller sia ereditato da UIView. Se è ereditato da UIViewController, utilizzare invece controller.view.

Problemi correlati