在任何子视图之前,超级视图如何拦截触摸序列?

时间:2009-11-04 13:59:07

标签: iphone cocoa-touch uiscrollview subview

我有一个视图层次结构,其布局如下:

parentView

 scrollView

    contentViewA

    containerView

         contentViewB

         contentViewC

我希望contentViewB响应触摸。不幸的是,scrollView使得这几乎不可能,因为它试图摄取触摸本身使得contentViewB的触摸响应变得不稳定。

所以,相反,我想拦截parentView中的所有触摸,直接操作contentViewB,然后将触摸传递给scrollView,以便它可以做到这一点。

有人可以告诉我正确的解决方法吗?

提前致谢。

干杯, 道格

更新:

我做了一点挖掘,发现属性canCancelContentTouches这似乎有效。我正在使用IB,所以我取消选中IB中的“可取消的内容触摸” - 滚动视图属性检查器的第一个选项卡。现在,当我运行应用程序时,触摸似乎可靠地到达contentViewB。

以下是UIScrollView文档描述此属性的方式:

讨论 如果此属性的值为YES并且内容中的视图已开始跟踪触摸它的手指,并且如果用户拖动手指足以启动滚动,则视图将接收touchesCancelled:withEvent:消息并且滚动视图处理触摸滚动。如果此属性的值为NO,则在内容视图开始跟踪时,无论手指移动,滚动视图都不会滚动。

相当不透明吧?无论如何,它似乎有效。

2 个答案:

答案 0 :(得分:2)

要阻止滚动视图拦截触摸事件,请设置userInteractionEnabled属性,如下所示:

scrollView.userInteractionEnabled = NO;

答案 1 :(得分:1)

另一种方法是向你的ui添加另一个子视图,所以它看起来像这样:

parentView
  scrollView
    contentViewA
      containerView
        contentViewB
        contentViewC
  touchGrabber

并且,在touchGrabber中,检测您想要的所有触摸(通过子类化UIView)

这比Phil Nash的解决方案更复杂,但有一个优点,你可以在不需要处理userInteractionEnabled值的情况下从parentView添加/删除其他视图 - 如果你有第三方库,这很有用例如,添加视图。

但是,如果你肯定只有滚动视图,Phil Nash的回答就是前进的方向!

谢谢,

萨姆