2010-03-25 6 views
5

Je commence à apprendre à utiliser l'animation UIView. Donc, je l'ai écrit les lignes suivantes:setAnimationRepeatAutoreverses ne s'est pas comporté comme prévu

[UIView beginAnimations:nil context:NULL]; 

[UIView setAnimationDuration:2.0]; 
[UIView setAnimationRepeatCount:2]; 
[UIView setAnimationRepeatAutoreverses:YES]; 

CGPoint position = greenView.center; 
position.y = position.y + 100.0f; 
position.x = position.x + 100.0f; 
greenView.center = position; 

[UIView commitAnimations]; 

Dans ce cas, la UIView (une boîte verte) est retourné 2 fois et FORE. Jusqu'ici tout va bien, MAIS j'ai découvert qu'après le déplacement deux fois, la boîte verte a fini par sauter à la "nouvelle position" (position.x + 100.0f, position.y + 100.0f) au lieu de retourner à la position d'origine (position.x, position.y). Cela rend l'animation assez bizarre (comme si la boîte revenait à la position initiale provoquée par setAnimationRepeatAutoreverses, elle revient à la nouvelle position dans la dernière microseconde!)

Quelle est la meilleure façon de créer la boîte verte? sauter à la nouvelle position à la toute dernière minute?

Répondre

1

J'ai eu exactement le même problème avec l'utilisation UIView animations sur la propriété alpha. Le pire est que l'animation saute à la position "finale" avant le message animationDidStop: delegate est envoyé, ce qui signifie que vous ne pouvez pas définir manuellement l'état d'origine.

Ma solution était d'utiliser les messages des délégués de animationDidStop pour créer un nouveau bloc d'animation, et les cordes tous ensemble:

- (void)performAnimation 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(phase1AnimationDidStop:finished:context:)]; 

    // Do phase 1 of your animations here 
    CGPoint center = someView.center; 
    center.x += 100.0; 
    center.y += 100.0; 
    someView.center = center; 

    [UIView commitAnimations]; 
} 

- (void)phase1AnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(phase2AnimationDidStop:finished:context:)]; 

    // Do phase 2 of your animations here 
    CGPoint center = someView.center; 
    center.x -= 100.0; 
    center.y -= 100.0; 
    someView.center = center; 

    [UIView commitAnimations]; 
} 

- (void)phase2AnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    // Perform cleanup (if necessary) 
} 

Vous pouvez enchaîner autant de blocs d'animation que vous voulez de cette façon. Cela semble être un gaspillage de code, mais jusqu'à ce qu'Apple nous donne une propriété - [UIView setAnimationFinishesInOriginalState:] ou quelque chose de similaire, c'est la seule façon que j'ai trouvée pour résoudre ce problème.

+0

En fait, si je suis directement votre code, la vue volera continuellement vers le coin supérieur gauche. Nous n'avons pas vraiment besoin de créer une animation. Juste faire -100 pour les deux x et y du centre devrait être suffisant. – user222292

+0

Je ne suis pas sûr de ce que vous voulez dire - pouvez-vous clarifier ce qui ne va pas avec le code que j'ai donné? –

2

je trouve à l'aide d'un nombre pair pour setAnimationDuration mettra fin à l'animation répétition à sa position initiale, puis pop à la position finale après la fin de l'animation de répétition. Si je règle setAnimationDuration à mi-cycle, l'animation de répétition se terminera à la position finale. C'est une manière plus simple de gérer l'animation que d'utiliser setAnimationDidStopSelector: method.

// Repeat Swimming 
CGPoint position = swimmingFish.center; 
position.y = position.y - 100.0f; 
position.x = position.x - 100.0f; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:1.0f]; 
[UIView setAnimationRepeatCount:2.5]; 
[UIView setAnimationRepeatAutoreverses:YES]; 

swimmingFish.center = position; 
+0

J'ai utilisé 2.1f et il m'a semblé OK .. – Sam

+1

Cela ne fonctionne pas pour moi (XCode 4.5.2 et iOS6). – Alex

Questions connexes