2011-10-14 6 views
10

Esiste un metodo per rilevare quando un'animazione è terminata? Voglio chiamare [nav setTitle:navItem] quando l'animazione è finita.iOS: come rilevare quando un'animazione è terminata?

Di seguito è riportato uno snippet del mio codice. Spero che la domanda sia abbastanza chiara, così posso ottenere una soluzione, e preferibilmente un esempio.

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

Se trovi che una risposta risolve il tuo problema, è bene accettarlo e ottieni 2 punti reputazione. – zaph

risposta

4

L'animazione è terminata quando [animation isAnimating] == NO.

Se si vuole aspettare fino a quando non è finito, ma non bloccare l'interfaccia utente:

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

Grazie mille, proprio quello di cui avevo bisogno. Problema risolto! :) – thar

+1

@thar: Se questo ha risolto il problema, "accetta" la risposta: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

+0

Questo non sembra per lavorare più: http://stackoverflow.com/questions/3144300/isanimating-return-is-faulty-for-uiimageview-for-iphone – Nuthinking

10

È possibile utilizzare il delegato 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

Non so se questo funzioni per l'animazione del tipo animationImages. Funziona solo con le animazioni utilizzando [UIView beginAnimations: context:]. – morningstar

+3

Non funziona per l'animazione del tipo animationImages. – Dustin

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

-(void)animationFinished { 
    // do stuff 
} 

Ciò presuppone solo che l'animazione completerà nella quantità di tempo che hai detto a.