2012-01-30 18 views
5

Chcę ukryć pasek nawigacji za pomocą animacji, zanim pozwolę, aby kontroler UIViewController zniknął. Dlatego wdrożyliśmy następujące:Jak czekać na zakończenie animacji w widokuDidDisappear?

-(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]; 
} 

Problemem jest to, że viewWillDisappear będzie nadal wykonywać i po prostu wrócić i cały widok odejdzie zanim zakończy animacji. W jaki sposób mogę zatrzymać powrót metody przed zakończeniem animacji (gdzie drukowana jest "animacja zakończona").

+0

Nie możesz tego ożywić. Może zamiast tego szukasz metody 'setNavigationBarHidden: animated:'? –

+0

Nie chcę używać 'setNavigationBarHidden: animated:', ponieważ animuje się inaczej w iOS 4 (przesuwa się w lewo) i iOS 5 (przesuwa się w kierunku do góry). W każdym razie nie ma to znaczenia, ponieważ umieszczenie 'setNavigationBarHidden: animated:' w bloku 'viewWillDisappear' nadal będzie oznaczać, że metoda powróci przed zakończeniem animacji. Sądzę, że potrzebne są tu dwa wątki? –

Odpowiedz

2

viewWillDisappear:animated jest zasadniczo kurtuazyjnym powiadomieniem. Po prostu mówi ci, co jest bliskie, zanim to się stanie. W rzeczywistości nie można zablokować ani opóźnić zniknięcia widoku.

Najlepszym rozwiązaniem byłoby, aby utworzyć kategorię na UINavigationController która tworzy metod, takich jak (niesprawdzone):

- (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]; 
        }]; 
} 

Następnie można nazwać je na zamiast

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

i

- (void)popViewControllerAfterAnimationAnimated:(BOOL)animated

odpowiednio.

+0

Wygląda świetnie :), chociaż nie jestem pewien, co się stanie, gdy użyjesz transitionWithView: z opcją curveEaseInOut, nigdy tego nie próbowałem. –

+0

Zgadzam się, nie jestem też całkowicie pewien. Używanie transitionWithView: pochodzi z oryginalnego kodu OP, ale go nie przetestowałem. –

Powiązane problemy