【问题标题】:UISplitViewController swipe gesture interferes with other swipe gestureUISplitViewController 滑动手势干扰其他滑动手势
【发布时间】:2014-08-06 15:08:07
【问题描述】:

我正在使用UISplitViewController,其中一个详细视图控制器包含一个添加了UIPanGestureRecognizer 的视图。当我在详细视图控制器中滑动此视图时,手势被识别,但拆分视图控制器的滑动手势识别器干扰它;主视图控制器被显示,而来自细节控制器的手势识别器被忽略。

UIGestureRecognizerDelegate 实现和调试shouldRecognizeSimultaneouslyWithGestureRecognizer 方法会显示两个UIPanGestureRecognizer 对象:一个来自详细视图控制器,一个来自拆分视图控制器,所以我确定它们相互干扰。

当我在拆分视图控制器上设置presentsWithGesture = NO 时,详细视图控制器内的手势识别器确实可以工作。但这会禁用拆分视图控制器上的手势识别器,因此它并不是真正解决问题的方法。

我也尝试在拆分视图控制器上禁用手势识别器,仅当我需要其他手势识别器工作时,但似乎一旦拆分视图控制器变得可见就无法设置presentsWithGesture .

我还尝试禁用拆分视图控制器上的默认手势并添加我可以控制的自定义手势,但它不起作用。我尝试在手势上使用拆分视图控制器栏按钮中的targetaction,但它不起作用。在拆分视图控制器上调用 toggleMasterVisible: 也不是一种选择,因为它是私有 api 的一部分。

有人对如何处理这个问题有任何建议吗?

【问题讨论】:

  • 你能在SplitViewControllers上调用requireGestureRecognizerToFail:UIPanGestureRecognizer吗?
  • 或者当第一个参数是您的UIPanGestureRecognizer 时,从您的代表gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer: 方法返回YES 以使其优先?
  • 在拆分视图控制器的UIPanGestureRecognizer 上调用requireGestureRecognizerToFail 成功了,谢谢!您可以将其发布为答案以便我接受吗?
  • 我可以,尽管您已经接受了另一个答案?出于兴趣,您是如何获得拆分视图控制器的 UIPanGestureRecognizer 的?
  • 在详细视图的viewWillAppear 中,我使用self.splitViewController.view.gestureRecognizers[0] 来获取它。

标签: ios objective-c


【解决方案1】:

我建议您在需要另一个手势工作时禁用UISplitViewController 平移手势。应该这样做:

for (UIGestureRecognizer* recognizer in [splitViewController gestureRecognizers]) {
    if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        [recognizer setEnabled:NO];
    }
}

您可能不想每次都搜索它,所以我会在视图加载时存储对该手势识别器的引用,然后根据需要禁用和启用:

在 viewDidLoad 上:

for (UIGestureRecognizer* recognizer in [splitViewController gestureRecognizers]) {
    if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        [self setSplitViewPanGesture:recognizer];
    }
}

稍后:

[self.splitViewPanGesture setEnabled:NO];

及以后:

[self.splitViewPanGesture setEnabled:YES];

【讨论】:

  • 谢谢,这也有效,但迈克的建议效果更好。它允许拆分视图控制器手势继续工作,除非当我滑动另一个视图时,该滑动被识别,并且拆分视图控制器不再干扰。
  • 为了清楚起见,如果在详细视图上触摸结束后重新启用拆分视图,您将获得相同的结果。但是在这种情况下 requireGestureRecognizerToFail 可能是更好的解决方案。同意。
  • 啊,我明白了。我以为你的意思只是简单地禁用它,但你只在触摸开始时禁用它。这实际上是一个更好的主意,因为它允许我为多个手势禁用它,而不仅仅是requireGestureRecognizerToFail 指定的那个。我可以通过在shouldReceiveTouch 方法中禁用拆分视图控制器手势来实现这一点,并在其状态更改为UIGestureRecognizerStateEndedUIGestureRecognizerStateCancelled 时在详细视图手势操作方法中重新启用它。
  • 宾果游戏。我没有详细说明何时禁用以及何时重新启用,因为根据用例有不同的方法来执行此操作。
  • 而不是使用requireGestureRecognizerToFail,如果您在您的委托上使用gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:,那么您可以将其应用于多个手势,而无需手动禁用和重新启用拆分视图控制器手势...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多