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

UINavigationContoller interactivePopGestureRecognizer неактивен, когда панель навигации скрыта

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

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

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

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

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

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

4b9b3361

Ответ 1

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

self.navigationController.interactivePopGestureRecognizer.delegate = self;

Что это!

Ответ 2

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

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

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

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

Ответ 3

Я использовал это. 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, пользовательский интерфейс не будет принимать никаких изменений сейчас. Нажмите главную кнопку, чтобы добавить приложение в фоновом режиме, а затем нажмите для входа на передний план...

Ответ 4

Это не работает для меня. Я следил за записью в блоге Keithl. Это тоже не работало.

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

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

Ответ 5

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

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

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