2010-01-22 20 views
5

Estoy comenzando una ampliación animada cuando se toca una imagen, y luego escalando de nuevo a su tamaño normal cuando se lanza. Mediante el uso de setAnimationBeginsFromCurrentState: YES, el efecto de acercamiento es agradable y suave si levantas el dedo en parte para animarlo.iPhone SDK: ¿cómo puedo saber cuándo ha finalizado una animación?

Sin embargo, lo que quiero hacer es "bloquear" el tamaño más grande en su lugar si ha tocado la imagen el tiempo suficiente para que la animación se complete, pero deje que retroceda como lo hace normalmente si lo suelta prematuramente.

¿Hay alguna manera de saber si actualmente hay una animación ejecutándose o si se ha completado una animación en particular?

Me imagino que probablemente pueda hacer esto con un performSelector: afterDelay: call in touchesStarted, con un retraso igual a la duración de la animación y cancelarla si toquesEnded llega demasiado pronto, pero no me puedo imaginar que sea la mejor manera ...?

Respuesta

13
- (void)animateStuff { 
    [UIView beginAnimations:@"animationName" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [self.view doWhatever]; 
    [UIView commitAnimations]; 
} 

- (void)animationDidStop:(NSString *)animationID 
       finished:(NSNumber *)finished 
       context:(void *)context 
{ 
    if ([finished boolValue]) { 
     NSLog(@"Animation Done!"); 
    } 
} 
+1

Me tomó un tiempo para darse cuenta de esto en realidad hizo lo que quería. Se llama a animationDidStop ya sea que el zoom llegue a donde estaba yendo, o si la animación que se contrae toma el control. Sin embargo, el valor de finished nos dice si terminó como se le indicó originalmente. Puedo sugerir cambiar el cuerpo de animationDidStop en su ejemplo a: if ([finished boolValue]) { NSLog (@ "Animation Finished!"); } Esta es entonces una respuesta perfecta :) –

0

Creo que "+ (void) setAnimationDidStopSelector: (SEL) selector" debería hacer lo que quiera. Llamará al selector dado en su delegado una vez que la animación se haya completado.

1

Otra posibilidad:

[UIView animateWithDuration:0.3 animations:^{ 

     myView.transform = CGAffineTransformMakeRotation(M_PI); 

}completion:^(BOOL finished) { 

     NSLog(@"Animation complete!"); 
}]; 
Cuestiones relacionadas