在某些情况下,使superview响应subViews Pan Gesture

时间:2014-03-13 12:53:56

标签: ios iphone objective-c uigesturerecognizer uipangesturerecognizer

我有一个scrollView,它包含一个subView。 SubView添加了一个panGesture。

我想要什么

只有在垂直进行平移时,我才需要使用pangest来处理子视图。如果平移是水平发生的,我希望scrollView响应平移而不是子视图。我怎样才能实现这个

注意:当横向平移时,我能够以编程方式找到它。

2 个答案:

答案 0 :(得分:1)

由于您已经知道如何检测平移,因此您需要在superview中实现委托协议,在子视图中实现委托属性,并将您的超级视图指定为子视图的委托。

当检测到水平平移时,调用委托方法,当检测到垂直平移时,在子视图中实现你想要的内容。

答案 1 :(得分:1)

有几种方法可以做到这一点:

  1. 根据子视图的功能,您可以将其替换为滚动视图,并将其锁定为仅垂直滚动。 (而super应该只能水平滚动。)
  2. 如果平移手势水平移动,您可以尝试将子视图中的触摸信息提供给它的超级视图。您可以使用委托模式执行此操作,或者,如果您知道自己的超级视图是什么,则只需在子视图中访问superview即可。但是,这会在两个视图之间产生强大的耦合,并且可能不应该这样做。它会很脆弱,许多人会认为它是代码味道。
  3. (最佳选项) - 子类UIGestureRecognizer并创建自己的手势识别器,仅识别垂直移动。使用它而不是UIPanGestureRecognizer
  4. 选项3是最好的,但可能是最多的工作。您需要阅读Apple关于子类化UIGestureRecognizerApple Docs - UIGestureRecognizer的文档。

    我还编写了自己的拖动手势识别器,FlxDragGestureRecognizer.mFlxDragGestureRecognizer.h(类似于平移手势识别器),如果您愿意,可以使用它,或者查看很好地了解如何继承UIGestureRecognizer。您可以使用此类来识别仅在某些方向上移动的触摸,否则它将失败(这将允许其他手势识别器识别器,如滚动视图)。它还有许多其他自定义和收集的信息,如速度。