我有一个视图层次结构,其布局如下:
parentView
scrollView
contentViewA
containerView
contentViewB
contentViewC
我希望contentViewB响应触摸。不幸的是,scrollView使得这几乎不可能,因为它试图摄取触摸本身使得contentViewB的触摸响应变得不稳定。
所以,相反,我想拦截parentView中的所有触摸,直接操作contentViewB,然后将触摸传递给scrollView,以便它可以做到这一点。
有人可以告诉我正确的解决方法吗?
提前致谢。
干杯, 道格
更新:
我做了一点挖掘,发现属性canCancelContentTouches这似乎有效。我正在使用IB,所以我取消选中IB中的“可取消的内容触摸” - 滚动视图属性检查器的第一个选项卡。现在,当我运行应用程序时,触摸似乎可靠地到达contentViewB。
以下是UIScrollView文档描述此属性的方式:
讨论 如果此属性的值为YES并且内容中的视图已开始跟踪触摸它的手指,并且如果用户拖动手指足以启动滚动,则视图将接收touchesCancelled:withEvent:消息并且滚动视图处理触摸滚动。如果此属性的值为NO,则在内容视图开始跟踪时,无论手指移动,滚动视图都不会滚动。
相当不透明吧?无论如何,它似乎有效。
答案 0 :(得分:2)
要阻止滚动视图拦截触摸事件,请设置userInteractionEnabled属性,如下所示:
scrollView.userInteractionEnabled = NO;
答案 1 :(得分:1)
另一种方法是向你的ui添加另一个子视图,所以它看起来像这样:
parentView
scrollView
contentViewA
containerView
contentViewB
contentViewC
touchGrabber
并且,在touchGrabber中,检测您想要的所有触摸(通过子类化UIView)
这比Phil Nash的解决方案更复杂,但有一个优点,你可以在不需要处理userInteractionEnabled值的情况下从parentView添加/删除其他视图 - 如果你有第三方库,这很有用例如,添加视图。
但是,如果你肯定只有滚动视图,Phil Nash的回答就是前进的方向!
谢谢,
萨姆