2010-07-14 3 views
4

J'ai donc quelques blocs d'animation pour créer des animations très simples sur mon application (par exemple une roue qui tourne continuellement). C'est le code de l'animation (j'ai changé de l'ancien bloc de style commitanimations mais j'ai eu le même problème avec ça).Pourquoi ai-je besoin de faire cela et y at-il un meilleur moyen? Blocs d'animation sur l'application iPhone OS4

[UIView animateWithDuration:30 delay:0.0 
    options:(UIViewAnimationOptionAllowUserInteraction | 
    UIViewAnimationOptionCurveLinear 
    | UIViewAnimationOptionRepeat) 
animations:^(void){ 
    wheel.transform = CGAffineTransformMakeRotation(M_PI*-0.5); 
} 
completion:^(BOOL finished){ 
if(finished){NSLog(@"^^^^^^^^wheel^^^^FINSIHED"); 
    ]} 
}]; 

Le problème est que je le OS4 lorsque l'application a été rejetée à la barre multi-tâches et reprend les arrêts d'animation. Si le CV réinitialiser la position lorsque l'application devient de nouveau actif, comme celui-ci ....

wheel.transform = CGAffineTransformMakeRotation(0); 

il continue.

Ce n'est pas idéal car mon animation saute quand elle redémarre. Je ne comprends pas pourquoi cela arrive ou pourquoi je devrais le faire. La méthode "sur fini" est appelée presque immédiatement au démarrage de l'animation, ce qui est étrange car cette animation ne devrait jamais finir. En outre, il n'est pas appelé lorsque l'application devient active et l'animation s'arrête réellement.

Des idées ou des suggestions? J'ai lutté avec cela depuis un certain temps maintenant ...

Répondre

0

La syntaxe de votre code n'est pas valide votre code ne sera pas compilé comme indiqué. Une version correcte serait:

[UIView animateWithDuration:2 delay:0.0 
        options:(UIViewAnimationOptionAllowUserInteraction | 
          UIViewAnimationOptionCurveLinear 
          | UIViewAnimationOptionRepeat) 
       animations:^(void){ 
        wheel.transform = CGAffineTransformMakeRotation(M_PI*-0.5); 
       } 
       completion:^(BOOL finished){ 
        if(finished) NSLog(@"^^^^^^^^wheel^^^^FINSIHED"); 
       } 
    ]; 

La raison pour laquelle « on a terminé » Le bloc est appelé lorsque l'application reprend après la suspension et que vous définissez transformer de l'animation va est à nouveau que la roue est déjà à sa position finale (ce est l'endroit où vous le placez dans votre bloc d'animations). Ainsi, lorsque l'application reprend, vous devez d'abord réinitialiser la transformation de la roue (je le ferais en la définissant sur CGAffineTransformIdentity), puis définir l'animation en cours.

Une approche plus intelligente consisterait à utiliser CGAffineTransformRotate (et non CGAffineTransformMakeRotation). De cette façon, vous pouvez définir la transformation en fonction de ce que la transformation est maintenant, plutôt que de la définir absolument.

[UIView animateWithDuration:2 delay:0.0 
        options:(UIViewAnimationOptionAllowUserInteraction | 
          UIViewAnimationOptionCurveLinear 
          | UIViewAnimationOptionRepeat) 
       animations:^(void){ 
        wheel.transform = CGAffineTransformRotate(view.transform, (M_PI*-0.5)); 
       } 
       completion:^(BOOL finished){ 
        // whatever 
       } 
    ]; 

Je suppose que votre roue est symétrique par rapport à votre angle choisi, afin que l'utilisateur ne verra jamais la différence, et le glissement que vous vous plaignez (lors de la réinitialisation de la transformation) seront éliminés.

1

Vous devez soit configurer un temporisateur en utilisant NSTimer ou utiliser CADisplaylink comme ceci: displayLink = [CADisplayLink displayLinkWithTarget: self selector: @selector (animateImages :)]; et modifiez la rotation CGAffineTransformMakeRotation (degrés) de votre vue dans la méthode déléguée.

+0

Merci, je pourrais utiliser une minuterie pour animer les pièces, je n'y avais pas vraiment réfléchi. Cela semble plus compliqué cependant, savez-vous pourquoi ma méthode ci-dessus ne fonctionne pas? – user157733

+0

'NSTimer' ou' CADisplayLink' sont de meilleurs choix pour les animations de longue durée comme celle-ci.Les animations 'UIView' sont censées être de courte durée, généralement à la suite d'une interaction de l'utilisateur. –

1

J'ai un problème similaire. J'ai été capable de surmonter ce problème en désactivant la possibilité pour l'application de s'exécuter en arrière-plan en ajoutant la clé: "L'application ne s'exécute pas en arrière-plan" et en la réglant sur OUI dans info.plist. Si votre application n'a pas besoin de s'exécuter en arrière-plan et que est OK si elle est ramenée à son état initial lors de la reprise, alors ce fonctionnera.

Questions connexes