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

时间:2016-11-09 12:29:50

标签: ios swift uipangesturerecognizer

我有以下设置。

  • 主视图控制器(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中对其地图的处理方式。我还附上了一个小gif来演示我的意思。

demo image

可在此处找到演示项目。

demo project

2 个答案:

答案 0 :(得分:0)

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

  • (1)添加UIButton,将框架设置为CGRect.zero,将其添加到ListVC。

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

    myButton.sendAction(Selector(("tapFound")), to: nil, for: nil)
    
  • (3)在您的MainVC中,添加此功能:

    func tapFound() {
    
    }
    

我之前在一些应用程序中完成了这个操作,告诉主VC添加一些新的子视图。您甚至可以将发件人(UITapRecognizer不是)传递给新的视图控制器,并将tag属性设置为让VC确切知道所需的内容。

答案 1 :(得分:0)

我通过在平移手势功能中添加了此内容来解决了此问题

        guard scrollView.contentOffset.y == 0 else{return}

因此,只要到达顶部(滚动视图),它就会开始平移