2012-01-30 19 views
5

Voglio nascondere la barra di navigazione utilizzando l'animazione prima di far scomparire un UIViewController. Perciò ho attuato le seguenti:Come aspettare che un'animazione finisca in viewDidDisappear?

-(void) viewWillDisappear:(BOOL) animated { 
    [UIView transitionWithView:self.view 
         duration:UINavigationControllerHideShowBarDuration 
         options:UIViewAnimationCurveEaseOut 
        animations:^{ 
     [self.navigationController setNavigationBarHidden:YES];  
    } 
        completion:^(BOOL finished){ 
        NSLog(@"animation finished"); 
    }]; 

    [super viewWillDisappear:animated]; 
} 

Il problema è che il viewWillDisappear continuerà ad eseguire e solo tornare e tutta la visione andrà via prima del termine di animazione. Come posso interrompere il ritorno del metodo prima del completamento dell'animazione (dove viene stampata l'animazione finita).

+0

Non è possibile animare. Forse invece stai cercando il metodo 'setNavigationBarHidden: animated:'? –

+0

Non voglio usare 'setNavigationBarHidden: animated:' perché si anima in modo diverso in iOS 4 (scorre verso sinistra) e iOS 5 (scorre verso l'alto). Comunque, non importa perché, mettendo 'setNavigationBarHidden: animated:' all'interno del blocco 'viewWillDisappear' significa che il metodo ritorna prima che l'animazione finisca. Penso che forse sono necessari due thread qui? –

risposta

2

viewWillDisappear:animated è in sostanza una notifica di cortesia. Ti sta solo dicendo cosa è imminente prima che accada. Non puoi effettivamente bloccare o ritardare la scomparsa della vista.

La soluzione migliore sarebbe quella di creare una categoria sulla UINavigationController che crea metodi come (non testata):

- (void)pushViewControllerAfterAnimation:(UIViewController *)viewController animated:(BOOL)animated { 
    [UIView transitionWithView:viewController.view 
         duration:UINavigationControllerHideShowBarDuration 
         options:UIViewAnimationCurveEaseOut 
        animations:^{ 
         [self.navigationController setNavigationBarHidden:NO];  
        } 
        completion:^(BOOL finished){ 
         NSLog(@"animation finished"); 
         [self pushViewController:viewController animated:animated]; 
        }]; 
} 

- (void)popViewControllerAfterAnimationAnimated:(BOOL)animated { 
    [UIView transitionWithView:self.visibleViewController.view 
         duration:UINavigationControllerHideShowBarDuration 
         options:UIViewAnimationCurveEaseOut 
        animations:^{ 
         [self.navigationController setNavigationBarHidden:YES];  
        } 
        completion:^(BOOL finished){ 
         NSLog(@"animation finished"); 
         [self popViewControllerAnimated:animated]; 
        }]; 
} 

È quindi possibile chiamare questi sul posto di

- (void)pushViewControllerAfterAnimation:(UIViewController *)viewController animated:(BOOL)animated

e

- (void)popViewControllerAfterAnimationAnimated:(BOOL)animated

rispettivamente.

+0

Sembra fantastico :), anche se non sono sicuro di cosa succede quando usi transitionWithView: con un'opzione curveEaseInOut, non l'ho mai provato in questo modo. –

+0

Sono d'accordo, non ne sono del tutto sicuro neanche io. L'uso di transitionWithView: proviene dal codice originale di OP, ma non l'ho testato. –

Problemi correlati