17

У меня есть контроллер вида, который вложен в UINavigationController.UINavigationContoller interactivePopGestureRecognizer неактивен, когда панель навигации скрыта

Я реализовал iOS 7 interactivePopGestureRecognizer, чтобы пользователь мог жестом вытолкнуть VC из стека.

Внутри VC у меня есть scrollview, и пока пользователь не находится в верхней части прокрутки, я скрываю все хром (панель навигации и строку состояния), чтобы сосредоточить внимание на контенте.

Однако при скрытой навигационной панели функция interactivePopGestureRecognizer не работает.

Я попытался включить его после его исчезновения и проверил, что он не ноль, однако он все еще не работает.

Есть ли что-нибудь, что мне не хватает?

ответ

36

Установите UIViewController подкласс в качестве делегата gestureRecognizer в:

self.navigationController.interactivePopGestureRecognizer.delegate = self; 

Вот оно!

+3

Спасибо, на самом деле установка его на ноль также работает. Интересно, это ошибка? – Dan

+16

Будет ошибка, если set self.navigationController.interactivePopGestureRecognizer.delegate для себя или нуля: проведите пальцем по краю экрана и нажмите что-нибудь, чтобы быстро нажать контроллер представления в контроллер навигации, затем - 1. Текущий вид контроллер не отвечает на какое-либо событие касания; 2. Новый просмотр не будет показан; 3. Снова проведите по краю экрана, будет показан новый просмотр; 4.Вызов popViewControllerAnimated: с анимированным параметром, установленным в НЕТ (нажмите пользовательскую кнопку возврата), сбой! – iwill

+4

Похоже, что * just * установка делегата недостаточна, см. Отчет о сбое by @iwill. Обходной путь, который мы нашли, состоял в том, чтобы сохранить исходный делегат, например. в 'viewDidLoad', установите себя как новый в' viewDidAppear: ', а затем снова установите его в исходное значение в' viewDidDisappear: '. Это странно, но работает. – Dennis

3

Это не работает для меня. Я последовал за сообщением Кейтла. Это тоже не работало.

Я в конечном счете поселился с UISwipeGestureRecognizer. Кажется, он делает то, что говорит.

UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(backButtonPressed:)]; 
[gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)]; 
[self.navigationController.view addGestureRecognizer:gestureRecognizer]; 
+0

Вы имели в виду использовать 'UIEdgePanGestureRecognizer'? – nekonari

+0

Не идеальное решение, но это будет сделано в крайнем случае. –

7

Я использовал это. self.navigationController.interactivePopGestureRecognizer.delegate = self;

также в моем классе UINavigationController, чтобы отключить interactivePopGestureRecognizer во время переходов.

- (void)pushViewController:(UIViewController *)viewController 
       animated:(BOOL)animated 
{ 
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 
     self.interactivePopGestureRecognizer.enabled = NO; 
} 

    [super pushViewController:viewController animated:animated]; 
} 

- (void)navigationController:(UINavigationController *)navigationController 
     didShowViewController:(UIViewController *)viewController 
        animated:(BOOL)animated 
{ 
    if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 
     // disable interactivePopGestureRecognizer in the rootViewController of navigationController 
     if ([[navigationController.viewControllers firstObject] isEqual:viewController]) { 
      navigationController.interactivePopGestureRecognizer.enabled = NO; 
     } else { 
      // enable interactivePopGestureRecognizer 
      navigationController.interactivePopGestureRecognizer.enabled = YES; 
     } 
    } 
} 

причина отключения interactivePopGestureRecognizer в RootViewController: когда коромысло от края в RootViewController, а затем нажмите что-то, чтобы подтолкнуть в следующем ViewController, интерфейс не будет принимать какую-либо прикасается now.Press домашней кнопки, чтобы поместить приложение в фоновом режиме , а затем нажмите на него, чтобы войти на первый план ...

14

Простого решения

Просто установите скрытые свойства панели навигации не навигационного контроллер

Просто используйте эти два лину es

self.navigationController.navigationBarHidden = NO; 
self.navigationController.navigationBar.hidden = YES; 
+1

приятно !!! Большое спасибо за простое решение. – iWheelBuy

0

Добавление этих двух строк в -(void)viewDidAppear:(BOOL)animated сработало для меня.

self.navigationController.navigationBarHidden = NO; 
self.navigationController.navigationBar.hidden = YES; 

И не забудьте позвонить <UIGestureRecognizerDelegate> в .h файл.

Смежные вопросы