2010-03-25 6 views
5

Estoy empezando a aprender a utilizar la animación de UIView. Así que escribí las siguientes líneas:setAnimationRepeatAutoreverses no se comportó como esperaba

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

En este caso, el UIView (una caja verde) se movió hacia atrás y delanteras 2 veces. Hasta aquí todo bien, PERO descubrí que después del movimiento dos veces, la caja verde terminó saltando a la "nueva posición" (position.x + 100.0f, position.y + 100.0f) en lugar de volver a la posición original (position.x, position.y). Eso hace que la animación parezca bastante extraña (como después de que la caja vuelva a la posición original causada por setAnimationRepeatAutoreverses, salte a la nueva posición en el último microsegundo)

¿Cuál es la mejor manera de hacer que la caja verde NO saltar a la nueva posición en el último minuto?

Respuesta

1

He tenido exactamente el mismo problema con el uso de animaciones UIView en la propiedad alpha. Lo peor es que la animación salta a la posición "final" antes de animationDidStop: el mensaje de delegado se envía, lo que significa que no se puede establecer manualmente el estado original allí.

Mi solución fue usar los mensajes animationDidStop delegado para crear un nuevo bloque de animación, y la cadena de ellos todos juntos:

- (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) 
} 

Usted puede encadenar tantos bloques como desee animación de esta manera. Parece un desperdicio de código, pero hasta que Apple nos dé una propiedad [UIView setAnimationFinishesInOriginalState:] o algo similar, esta es la única forma que he encontrado para resolver este problema.

+0

En realidad, si sigo directamente su código, la vista volará continuamente hacia la esquina superior izquierda. Realmente no necesitamos crear una animación. Simplemente haga -100 para ambos x e y del centro debería ser suficiente. – user222292

+0

No estoy seguro de lo que quieres decir, ¿puedes aclarar qué sucede con el código que he dado? –

2

Me parece que usar un número par para setAnimationDuration terminará la animación de repetición en su posición inicial y luego aparecerá en la posición final después de que termine la animación de repetición. Si configuro setAnimationDuration en medio ciclo, la animación repetida terminará en la posición final. Esta es una forma más limpia de manejar la animación que utilizar el método setAnimationDidStopSelector :.

// 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

Utilicé 2.1f y me pareció bien ... – Sam

+1

Esto no funciona para mí (XCode 4.5.2 e iOS6). – Alex

Cuestiones relacionadas