如何将控制从一个手势识别器传递给另一个

Posted

技术标签:

【中文标题】如何将控制从一个手势识别器传递给另一个【英文标题】:How to pass control from one gesture recogniser to the other 【发布时间】:2016-11-09 12:29:49 【问题描述】:

我有以下设置。

主视图控制器 (MainViewController) 在父子视图控制器配置中包含另一个视图控制器 (ListViewController)。

ListVC 从 MainVC 底部的某处开始。 ListVC 包含顶部的 UIView 和底部的表格视图。表格视图附加了一个平移手势识别器。

我想要实现的是,当我通过平移手势向上拉 ListVC 时,它会上升到屏幕顶部。当它到达顶部(或者更准确地说,在顶部布局指南下方一些距离)时,listVC 停止在 mainVC 中移动,并且表格视图开始滚动。这几乎就像我已经将控制从平移手势转移到了表格视图的手势。

我现在这样做的方式是实现UIGestureRecognizerDelegate 协议。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool 
    return true

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool 
    if gestureRecognizer == pullGesture           
      return pullGestureIsPriority
    

    return false

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool 
  if gestureRecognizer == pullGesture         
    return !pullGestureIsPriority
  

  return false

如果 listVC 没有到达顶部,pullGesutre 是一个优先级。我通过设置self.pullGesture.isEnabled = false 紧跟self.pullGesture.isEnabled = true 使pullGesture 失败。

现在一切正常;我能够在不向上滚动表格视图的情况下将其拉起,当 listVC 到达顶部时,拉动手势失败,因此表格视图开始向上滚动。当我向下滚动表格视图直到到达表格视图的顶部时,问题就出现了,此时,我希望 listVC 会通过拉动手势下降。但这并没有发生。不知何故,pullGesture 已从触摸事件链中移除。

有人知道我如何实现这一目标吗?

注意,实际上我是在尝试复制 Apple 在 ios 10 中对其 Map 的做法。我还附上了一个小 gif 来说明我的意思。

demo image

可以在此处找到演示项目。

demo project

【问题讨论】:

你能分享一个演示项目吗? @BlackM,我添加了一个演示项目。 你解决了吗? 【参考方案1】:

如果您要在两个视图控制器之间发送“事件”或“动作”,则可以使用 sendAction。

(1) 添加一个UIButton,将frame设置为CGRect.zero,添加到你的ListVC中。

(2) 在您要联系 MainVC 的 ListVC 代码中,添加以下行:

myButton.sendAction(Selector(("tapFound")), to: nil, for: nil)

(3) 在你的 MainVC 中,添加这个函数:

func tapFound() 


我以前在一些应用程序中这样做过,告诉主 VC 添加新的子视图。您甚至可以将发送者(UITapRecognizer 不是)传递给新的视图控制器,并设置标签属性以让 VC 确切知道需要什么。

【讨论】:

【参考方案2】:

我通过在平移手势功能中添加这个来解决这个问题

        guard scrollView.contentOffset.y == 0 elsereturn

所以只要它到达顶部(滚动视图)就会开始向下平移

【讨论】:

以上是关于如何将控制从一个手势识别器传递给另一个的主要内容,如果未能解决你的问题,请参考以下文章

手势识别器和 TableView

将现有和活动的手势识别器传递给模态视图控制器

如何在iOS中将触摸传递给手势识别器?

如何在 MapView 上点击然后将其传递给默认手势识别器?

从一个视图控制器访问一组图像到另一个视图控制器,以添加滑动手势识别器

使用滑动手势识别器从一个视图控制器滑动到另一个