2010-11-09 6 views
5

Je rencontre un problème étrange avec les blocs d'animation iPhone. Ce code:UIView animateWithDuration: delay: working weird

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

met instantanément l'arrière-plan rouge, sans passer l'état bleu. La même chose même pour ce code:

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

C'est, où je tente de lancer la deuxième animation après le premier est terminé. Quel est le problème?

+0

Quel type d'objet est le contrôleur? Un UIView, UILabel, autre? – Anna

Répondre

3

Je viens d'avoir cette question, et j'ai souvent il. Il y a deux causes, bien qu'il y en ait une que je n'ai pas encore testé.

Cause première, j'ai oublié de brancher le constructeur de l'interface à la vue animée, donc le bloc a dit "Animer sur rien? Il n'y a rien à faire, alors je vais passer au bloc d'achèvement!" L'autre raison est, il y a quelque chose à faire, mais ce n'est pas une propriété animable (cachée), et je parie que le bloc d'achèvement est appelé dès que les variables de l'animation correspondent à leur "to" ou " état final. C'est juste une théorie, mais je parie que c'est un thread séparé qui s'exécute à un certain rythme avec: if (currentValueOfProperty = finalValue) doCompletion(). (pardonnez le pseudo code).

Quelqu'un devrait probablement tester que, si

5

propriété backgroundColor est pas animée dans UIView. Au lieu de cela, utilisez backgroundColor propriété de la couche de la vue:

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

post-scriptum Comme indiqué dans les messages précédents, assurez-vous que votre controller est hérité de UIView. Si elle est héritée de UIViewController, utilisez plutôt controller.view.