Как ждать завершения анимации в viewDidDisappear? - PullRequest
5 голосов
/ 31 января 2012

Я хочу скрыть панель навигации с помощью анимации, прежде чем позволить исчезнуть UIViewController. Поэтому я реализовал следующее:

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

Проблема в том, что viewWillDisappear продолжит выполняться и просто вернется, и весь вид исчезнет до завершения анимации. Как я могу остановить возврат метода до завершения анимации (где печатается «анимация завершена»).

1 Ответ

2 голосов
/ 18 мая 2012

viewWillDisappear:animated по сути является любезным уведомлением. Это просто говорит вам, что неизбежно, прежде чем это произойдет. Вы не можете фактически заблокировать или задержать исчезновение вида.

Лучшим решением было бы создать категорию на UINavigationController, которая создает такие методы, как (не проверено):

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

Вы могли бы затем вызывать их вместо

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

и

- (void)popViewControllerAfterAnimationAnimated:(BOOL)animated

соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...