2010-04-16 4 views
4

J'ai une méthode qui anime l'un des sous-vues de UIWindow, puis le supprime de UIWindow en utilisant removeFromSuperview. Mais quand je mets removeFromSuperview après le bloc d'animation, l'animation ne montre jamais, parce que removeFromSuperview enlève le UIView de UIWindow avant que l'animation ne joue :-(Comment puis-je retarder removeFromSuperview pour que l'animation joue d'abord, puis la sous-vue est supprimée? J'ai essayé [NSThread sleepForTimeInterval:1]; après l'animation bloc, mais qui n'a pas eu l'effet désiré, car l'animation dort trop pour une raison quelconqueUIView removeFromSuperView délai d'animation

Mon code pour cette méthode.

- (void) animateAndRemove 
    { 
    NSObject *mainWindow = [[UIApplication sharedApplication] keyWindow]; 

    [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:0.8]; 
    UIView *theView = nil; 
    for (UIView *currentView in [mainWindow subviews]) 
    { 
     if (currentView.tag == 666) 
     { 
     currentView.backgroundColor = [UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:0.0]; 
     theView = currentView; 
     } 
    } 
    [UIView setAnimationTransition: UIViewAnimationTransitionNone forView:theView cache:YES]; 
     [UIView commitAnimations]; 



//[NSThread sleepForTimeInterval:1]; 

[theView removeFromSuperview]; 


    } 

Répondre

16

Vous devez utiliser le mécanisme de délégation dans les blocs d'animation pour décider quoi faire quand l'animation se termine.Pour votre cas, utilisez

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDelegate:theView]; 
[UIView setAnimationDidStopSelector:@selector(removeFromSuperview)]; 
.... 

Cela garantit que [theView removeFromSuperview] sera appelée une fois l'animation terminée.

+0

Wow, qui a fonctionné comme un charme! incroyable! merci – Mike

+0

Ceci est une bonne solution. Dommage que ce ne soit pas accepté. Up! – mtrc

7

Si vous iOS 4.0 vers le haut ciblage, vous pouvez utiliser des blocs d'animation:

[UIView animateWithDuration:0.2 
    animations:^{view.alpha = 0.0;} 
    completion:^(BOOL finished){ [view removeFromSuperview]; }]; 

(code ci-dessus provient de la documentation UIView d'Apple)

+1

Une solution plus élégante, pour moi, que la réponse acceptée – ehftwelve

Questions connexes