2

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

父视图

 scrollView

    contentViewA

    containerView

         contentViewB

         contentViewC

我希望 contentViewB 响应触摸。不幸的是,scrollView 使这几乎不可能,因为它试图摄取触摸本身,从而使 contentViewB 的触摸响应参差不齐。

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

有人可以告诉我正确的方法来完成这个吗?

提前致谢。

干杯,道格

更新:

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

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

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

比较不透明吧?无论如何,它似乎工作。

4

2 回答 2

2

要阻止滚动视图拦截触摸事件,请像这样设置 userInteractionEnabled 属性:

scrollView.userInteractionEnabled = NO;
于 2009-11-04T14:07:44.753 回答
1

另一种方法是在您的 ui 中添加另一个子视图,使其看起来像这样:

parentView
  scrollView
    contentViewA
      containerView
        contentViewB
        contentViewC
  touchGrabber

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

这比Phil Nash的解决方案更复杂,但优点是您可以从 parentView 添加/删除其他视图,而无需处理它们的 userInteractionEnabled 值 - 例如,如果您有第三方库添加视图,这很有用。

但是,如果您肯定只需要滚动视图,那么Phil Nash的答案就是前进的方向!

谢谢,

山姆

于 2009-11-04T14:31:29.447 回答