Подтвердить что ты не робот

Io7 навигационная проверка при завершении перехода

Я хочу отметить, что мой UINavigationController анимирует (push/pop) или нет.

У меня есть переменная BOOL (_isAnimating), и приведенный ниже код выглядит следующим образом:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    _isAnimating = YES;
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    _isAnimating = NO;
}

Но он работает неправильно в iOS7 с жестом салфетки. Предположим, что моя навигация: root- > view A → view B. Я сейчас на B.

  • В начале салфетки (возврат из B в A) вызывается функция "navigationController:willShowViewController:animated:(BOOL)animated", затем _isAnimating = YES.

  • В нормальном случае завершается салфетка (вернитесь к A), вызывается функция "navigationController:didShowViewController:animated:(BOOL)animated", затем _isAnimating = NO. Этот случай в порядке, но:

  • Если пользователь может просто проделать половину (половина перехода к A), то не хотите прокручивать предыдущее представление (вид A), он снова переходит к текущему виду (снова оставаться B). Тогда функция "navigationController:didShowViewController:animated:(BOOL)animated" не вызывается, моя переменная имеет неправильное значение (_isAnimating=YES).

У меня нет шансов обновить мою переменную в этом ненормальном случае. Есть ли способ обновить состояние навигации? Спасибо!

4b9b3361

Ответ 1

Ключ для решения вашей проблемы можно найти в свойстве interactivePopGestureRecognizer UINavigationController. Это распознаватель, который реагирует на вызовы контроллеров жестом салфетки. Вы можете заметить, что состояние распознавателя изменено на UIGestureRecognizerStateEnded, когда пользователь поднимает пальцы вверх. Итак, дополнительно к делегату диспетчера навигации вы должны добавить цель в Pop Recognizer:

UIGestureRecognizer *popRecognizer = self.navigationController.interactivePopGestureRecognizer;
[popRecognizer addTarget:self                       
                  action:@selector(navigationControllerPopGestureRecognizerAction:)];

Это действие будет вызываться каждый раз, когда изменится Pop Recognizer, включая конец жестов.

- (void)navigationControllerPopGestureRecognizerAction:(UIGestureRecognizer *)sender
{
    switch (sender.state)
    {
        case UIGestureRecognizerStateEnded:

        // Next cases are added for relaibility
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateFailed:

            _isAnimating = NO;
            break;

        default:
            break;
    }
}

P.S. Не забывайте, что свойство interactivePopGestureRecognizer доступно с iOS 7!