如何从自定义UIGestureRecognizer触发NavigationController的interactivePopGestureRecognizer

Sha*_*oop 2 uinavigationcontroller uigesturerecognizer ios ios7

iOS 7有一个很棒的交互式动画,用于弹出UIViewControllers.通过从屏幕左侧滑动触发转换,但我想通过在视图控制器中的任意位置滑动来触发转换.(我也想从边缘取消那些,所以我可以将它们用于另一个自定义转换...).

到目前为止,在我的视图控制器中我添加了这个init.我知道这是错的,我不确定我在做什么.

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
panRecognizer.delegate = self.navigationController.interactivePopGestureRecognizer.delegate;
[self.view addGestureRecognizer:panRecognizer];
Run Code Online (Sandbox Code Playgroud)

如何将其与内置的interactivePopGestureRecognizer绑定?应该用我的handleGesture:方法吗?

编辑:Apple的文档中,实际使用了tie这个词:

interactivePopGestureRecognizer

导航控制器在其视图上安装此手势识别器,并使用它将最顶层的视图控制器弹出导航堆栈.您可以使用此属性检索手势识别器,并将其与用户界面中其他手势识别器的行为联系起来.将手势识别器绑在一起时,请确保他们同时识别手势,以确保您的手势识别器有机会处理事件.

你如何与UIGestureRecognizers结合在一起?

Bri*_*kel 5

为什么interactivePopGestureRecognizer这个案子毫无价值

手势识别器有两个通知通道,代表和目标/操作.该委托用于"我是否应该考虑接受此手势",并且这个内部检查如下:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return !self.isAnimating &&
           self.viewControllers.count > 1 &&
           !self.navigationBarHidden &&
           [self _doesTheNavigationControllerDelegateHaveCustomTransitions] &&
           [self _someOtherSecretJunk];
}
Run Code Online (Sandbox Code Playgroud)

如果测试通过,则它会调用实际设置的目标/动作并激活交互式转换.

获得内置弹出交互的唯一方法是interactivePopGestureRecognizer传递其委托测试并调用操作.如果知道目标/操作是什么,我们可以尝试将其挂钩到您的自定义手势,如下所示:

[[UIPanGestureRecognizer alloc] 
    initWithTarget:self.navigationController._secretGestureRecognizerTarget 
            action:@selector(_secretGestureRecognizerAction:)];
Run Code Online (Sandbox Code Playgroud)

但即便如此,Apple也可以进行无证检查:

- (void)_secretGestureRecognizerAction:(id)sender
{
    NSParameterAssert(sender == self.navigationController.interactiveGestureRecognizer);
    ...
}
Run Code Online (Sandbox Code Playgroud)

你可以做什么

你可以做的比你希望的要复杂得多,但潜力更大.您需要创建自己的交互式过渡并将其附加到您自己的手势识别器.

您将要阅读教程并查看有关该主题的示例代码,但基本步骤如下:

  1. 创建符合UIViewControllerAnimatedTransitioningUIPercentDrivenInteractiveTransition的子类
  2. animateTransition:以与默认转换(或您自己的设计)的外观匹配的方式实现.
  3. 创建一个符合UINavigationControllerDelegate的类并实现动画方法以及处理手势识别器的方法.
  4. 设置导航控制器以使用该委托,使用该类处理目标/操作和委托方法将手势识别器添加到视图控制器.

重要的是要注意,一旦你添加自己的自定义过渡,interactivePopGestureRecognizer有效死亡和标准交互停止工作,所以你需要在任何地方做自定义的东西.