18

我有一个嵌套在UINavigationController.

我已经实现了 iOS 7 interactivePopGestureRecognizer 以使用户能够通过手势将 VC 从堆栈中弹出。

在 VC 中,我有一个滚动视图,虽然用户不在滚动视图的顶部,但我隐藏了所有 chrome(导航栏和状态栏)以将焦点放在内容上。

但是,在隐藏导航栏的情况下,interactivePopGestureRecognizer 无法正常工作。

在它消失并验证它不是 nil 后,我尝试启用它,但它仍然不起作用。

有什么我想念的吗?

4

5 回答 5

37

将您的 UIViewController 子类设置为 gestureRecognizer 的委托:

self.navigationController.interactivePopGestureRecognizer.delegate = self;

而已!

于 2013-11-07T10:58:46.427 回答
16

简单的解决方案

只需设置导航栏的隐藏属性,而不是通过导航控制器

只需使用这两行

self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.hidden = YES;
于 2014-04-24T04:26:51.027 回答
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;
        }
    }
}

在rootViewController中禁用interactivePopGestureRecognizer的原因是:当从rootViewController的边缘滑动,然后点击一些东西来推送下一个viewController,UI现在不会接受任何触摸。按home键将应用程序置于后台,然后点击进入前景...

于 2014-02-07T10:54:42.187 回答
3

这似乎对我不起作用。我关注了 Keithl 的博客文章。那也没有用。

我最终和UISwipeGestureRecognizer. 它似乎按照它所说的去做。

UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(backButtonPressed:)];
[gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.navigationController.view addGestureRecognizer:gestureRecognizer];
于 2013-12-27T23:24:20.690 回答
0

添加这两行-(void)viewDidAppear:(BOOL)animated对我有用。

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

<UIGestureRecognizerDelegate>并且不要忘记调用.h文件。

于 2015-11-14T18:45:00.397 回答