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)
.
У меня нет шансов обновить мою переменную в этом ненормальном случае. Есть ли способ обновить состояние навигации? Спасибо!
Ответы
Ответ 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!