Ответ 1
Установите подкласс UIViewController в качестве делегата gestureRecognizer:
self.navigationController.interactivePopGestureRecognizer.delegate = self;
Что это!
У меня есть контроллер представления, который вложен в UINavigationController
.
Я реализовал iOS 7 interactivePopGestureRecognizer, чтобы пользователь мог жестом выталкивать VC из стека.
Внутри VC у меня есть scrollview, и пока пользователь не находится наверху прокрутки, я скрываю все хром (панель навигации и строка состояния), чтобы сосредоточить внимание на контенте.
Однако при скрытой навигационной панели функция interactivePopGestureRecognizer не работает.
Я попытался включить его после того, как он исчез и подтвердил, что он не нуль, однако он все равно не работает.
Есть ли что-то, что мне не хватает?
Установите подкласс UIViewController в качестве делегата gestureRecognizer:
self.navigationController.interactivePopGestureRecognizer.delegate = self;
Что это!
Простое решение
Просто установите скрытое свойство навигационной панели не через навигационный контроллер
Просто используйте эти две строки
self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.hidden = YES;
Я использовал это.
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, пользовательский интерфейс не будет принимать никаких изменений сейчас. Нажмите главную кнопку, чтобы добавить приложение в фоновом режиме, а затем нажмите для входа на передний план...
Это не работает для меня. Я следил за записью в блоге Keithl. Это тоже не работало.
В конечном итоге я установил UISwipeGestureRecognizer
. Кажется, он делает то, что он говорит.
UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(backButtonPressed:)];
[gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.navigationController.view addGestureRecognizer:gestureRecognizer];
Добавление этих двух строк в -(void)viewDidAppear:(BOOL)animated
работало для меня.
self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.hidden = YES;
И не забудьте вызвать <UIGestureRecognizerDelegate>
в .h
файл.