gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:45 29 4
gpt4 key购买 nike

iOS 7 具有用于弹出 UIViewController 的出色交互式动画。过渡是通过从屏幕左侧滑动触发的,但我想通过在 View Controller 中的任意位置滑动来触发过渡。 (我还想从边缘取消那些,这样我就可以将它们用于另一个自定义过渡...)。

到目前为止,在我的 View Controller 中,我已经在 init 中添加了它。我知道这是错误的,但我不确定自己在做什么。

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

如何将它与内置的 interactivePopGestureRecognizer 联系起来?这应该在我的 handleGesture: 方法中完成吗?

编辑Apple's documentation领带这个词实际上是这样用的:

interactivePopGestureRecognizer

The navigation controller installs this gesture recognizer on its view and uses it to pop the topmost view controller off the navigation stack. You can use this property to retrieve the gesture recognizer and tie it to the behavior of other gesture recognizers in your user interface. When tying your gesture recognizers together, make sure they recognize their gestures simultaneously to ensure that your gesture recognizers are given a chance to handle the event.

如何将 UIGestureRecognizers 绑定(bind)在一起?

最佳答案

为什么 interactivePopGestureRecognizer 对于这种情况毫无值(value)

手势识别器有两个通知 channel ,委托(delegate)和目标/ Action 。代表用于“我是否应该考虑接受这个手势”,这个代表进行内部检查,例如:

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

如果测试通过,它会调用实际设置和动画交互过渡的目标/ Action 。

获得内置弹出交互的唯一方法是让 interactivePopGestureRecognizer 通过其委托(delegate)测试并调用操作。如果知道目标/ Action 是什么,我们可以尝试将其与您的自定义手势 Hook ,如下所示:

[[UIPanGestureRecognizer alloc] 
initWithTarget:self.navigationController._secretGestureRecognizerTarget
action:@selector(_secretGestureRecognizerAction:)];

但即便如此,Apple 也可能拥有无证支票,例如:

- (void)_secretGestureRecognizerAction:(id)sender
{
NSParameterAssert(sender == self.navigationController.interactiveGestureRecognizer);
...
}

你能做什么

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

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

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

重要的是要注意,一旦您添加了自己的自定义转换,interactivePopGestureRecognizer 就会停止运行,标准交互将停止工作,因此您需要在所有地方执行自定义操作。

关于ios - 如何从自定义 UIGestureRecognizer 触发 NavigationController 的 interactivePopGestureRecognizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21049088/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com