2011-10-14 17 views
10

¿Hay algún método para detectar cuándo termina una animación? Quiero llamar al [nav setTitle:navItem] cuando termine la animación.iOS: ¿Cómo detectar cuándo termina una animación?

A continuación hay un fragmento de mi código. Espero que la pregunta sea lo suficientemente clara, así que puedo obtener una solución, y preferiblemente un ejemplo.

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{ 

if(event.subtype == UIEventSubtypeMotionShake){ 


    NSString *imageUrl = @""; 
    NSString *navItem = @""; 

    int randomNumber = arc4random() % 3; 

    switch (randomNumber) { 
     case 0: 
      imageUrl = @"pic1.png"; 
      navItem = @"txt1"; 
      break; 
     case 1: 
      imageUrl = @"pic2.png"; 
      navItem = @"txt2"; 
      break; 
     case 2: 
      imageUrl = @"pic3.png"; 
      navItem = @"txt3"; 
      break; 
     default: 
      break; 
    } 

    animation.animationImages = [NSArray arrayWithObjects: 

           [UIImage imageNamed:@"pic1.png"], 
           [UIImage imageNamed:@"pic3.png"], 
           [UIImage imageNamed:@"pic2.png"], 
           [UIImage imageNamed:@"pic1.png"], 
           [UIImage imageNamed:@"pic2.png"], 
           [UIImage imageNamed:@"pic3.png"], 
           [UIImage imageNamed:imageUrl], 
           nil]; 

    UIImage *img = [UIImage imageNamed:imageUrl]; 
    [imageview setImage:img]; 

    [animation setAnimationRepeatCount:1]; 
    animation.animationDuration = 1; 
    [animation startAnimating]; 

    [nav setTitle:navItem]; 

} 

} 
+2

Si encuentras una respuesta que resuelve tu problema, es bueno aceptarlo y obtienes 2 puntos de reputación. – zaph

Respuesta

4

La animación ha finalizado cuando [animation isAnimating] == NO.

Si desea esperar hasta que se termine, pero no bloquear la interfaz de usuario:

while ([animation isAnimating]) { 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]]; 
} 
+0

Muchas gracias, justo lo que necesitaba. ¡Problema resuelto! :) – thar

+1

@thar: Si esto resolvió el problema, "acepta" la respuesta: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

+0

Esto no parece para seguir trabajando: http://stackoverflow.com/questions/3144300/isanimating-return-is-faulty-for-uiimageview-for-iphone – Nuthinking

10

Puede utilizar el delegado setAnimationDidStopSelector.
http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html

[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 


- (void)animationDidStop:(NSString*)animationID finished:(BOOL)finished context:(void *)context { 
    /*Do stuff*/ 
} 
+2

No sé si eso funciona para animationImages type animation. Solo funciona con animaciones usando [UIView beginAnimations: context:]. – morningstar

+3

No funciona para animaciones tipo de animación de imagen. – Dustin

-2
[self performSelector:@selector(animationFinished) withObject:nil afterDelay:1.0]; 

-(void)animationFinished { 
    // do stuff 
} 

Eso supone que la animación se completará en la cantidad de tiempo que le dijo que lo haga.

Cuestiones relacionadas