2010-11-15 5 views
1

J'ai une animation qui "soulève" un bouton et laisse tomber une ombre. Voici comment je le fais, par exemple.Les animations UIV ne fonctionnent pas correctement

button1shadow.alpha = 0; 
button1shadow.hidden = NO; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1.5]; 
CGRect frame11 =searchByName.frame; 
frame11.origin.y -=20; 
frame11.origin.x +=20; 
searchByName.frame = frame11; 
searchByNameLabel.frame = frame11; 
CGRect frame21 = button1shadow.frame; 
frame21.origin.y +=10; 
frame21.origin.x -=10; 
button1shadow.frame = frame21; 
searchByName.alpha  = 1; 
button1shadow.alpha  = 0.1; 
[UIView commitAnimations]; 

Cela fonctionne très bien si je l'exécute tout seul.

Puis j'ai mis ce code juste après le code ci-dessus.

button1shadow.hidden = NO; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDelay:2.0]; 
[UIView setAnimationDuration:1.5]; 
CGRect frame11 =searchByName.frame; 
frame11.origin.y +=20; 
frame11.origin.x -=20; 
searchByName.frame = frame11; 
searchByNameLabel.frame = frame11; 
CGRect frame21 = button1shadow.frame; 
frame21.origin.y -=10; 
frame21.origin.x +=10; 
button1shadow.frame = frame21; 
searchByName.alpha  = 1; 
button1shadow.alpha  = 0.1; 
[UIView commitAnimations]; 

Les deux fonctionnent très bien séparement, mais quand je les combine juste après l'autre la première animation n'apparaît pas, mais le bouton saute aux coordonnées que j'Assigné au lieu d'animation. Des idées?

Edit: J'ai aussi essayé d'appeler la deuxième animation en utilisant:

[NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(lowerButtons) userInfo:nil repeats:NO]; 

Cependant, il ne semble pas même appeler "lowerButtons".

Répondre

2

Vous définissez un délai d'animation, cela devrait donc fonctionner, mais avez-vous essayé de faire la deuxième animation dans un rappel de délégué? Découvrez UIView méthodes +setAnimationDelegate: et +setAnimationDidStopSelector:.

+0

En utilisant une combinaison de 'setAnimationDidStopSelector:' et 'setAnimationDelegate:' comme vous l'avez dit, j'ai réussi à faire fonctionner l'animation. Je vous remercie! –

0

Je pense que la façon dont cela fonctionne est que si vous avez démarré une animation avec un AnimationID donné, alors couru une autre animation avec le même ID, le second aurait "remplacer" le premier.

Ainsi, la réponse serait d'utiliser deux animationID différents dans chaque bloc beginAnimation.

Je ne suis pas tout à fait sûr comment le fait que vous passez "néant" affecte cette logique. Une seule façon de savoir ...

+0

Comment modifier l'ID d'animation? EDIT: Aurais-je simplement entrer un NSString au lieu de zéro? –

+0

Oui - il suffit de passer @ "FirstID" ou @ "SecondID" au lieu de "nil" comme premier paramètre. – Brad

+0

Eh bien, il semble que la modification de l'animation ne fonctionne pas. –

1

Lorsque vous validez une animation, les propriétés du UIView (ou CALayer) sont définies immédiatement. Par exemple. Si vous déplacez une vue de 100px, dès que vous avez effectué cette animation, l'image de la vue montre qu'elle est 100px, même si elle ne lui ressemble pas (encore). Si vous souhaitez mettre en file d'attente les animations les unes à la suite des autres, vous devez utiliser directement CAAnimation s ou configurer la deuxième animation dans le rappel animationDidStop: du premier délégué. Pour vous inscrire au rappel de délégué, voir +[UIView setAnimationDelegate:]. Alternativement, si la deuxième animation est simplement la première à l'envers, vous pouvez essayer d'utiliser les méthodes +[UIView setAnimationRepeatAutoreverses:] et +[UIView setAnimationRepeatCount:].

+0

Vous savez quel fou, j'ai essayé setAnimationRepeatAutoreverses sur un de mes animations, et a laissé les quatre autres les mêmes. Pour une raison étrange, ces quatre autres fonctionnaient normalement. Des idées? –

Questions connexes