将触摸事件传递给适当的兄弟UIViews

时间:2010-10-12 20:23:07

标签: ios events uiview touch uiresponder

我正在尝试在父级touchesBegan的叠加层中使用UIView处理触摸事件,但也允许触摸输入传递到下方的同级UIView。我预计会有一些直接的方式来处理触摸事件,然后说“现在将它发送给下一个响应者,好像这个不存在”,但我能找到的只是nextResponder方法似乎是将父级回馈给我的叠加视图。然后那个父母没有真正将它传递给那个叠加视图的下一个兄弟,所以我不确定如何做一个看似简单的任务,通常用触摸回调来获得一个真或假的返回值告诉它是否继续处理小部件层次结构。

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:3)

迟到的答案,但我认为最好覆盖hitTest:withEvent:而不是touchesBegan。在我看来,touchesBegan是一个非常“高级”的方法,只做一个简单的事情,所以如果事件进一步传播,你不能在那个级别改变。正确的地方是hitTest:withEvent:

另请查看this S.O. answer了解有关此问题的详细信息。

答案 1 :(得分:1)

我理解你正在寻找Joey所希望的行为 - 我没有在API中找到支持这种自动消息传递链接行为和兄弟视图的行为。

我最初在下面写的是关于通知父母UIView有关触摸的内容。这仍然适用,但我相信你需要更进一步,让父UIView使用Sergio在每个子视图上描述的命中测试技术,这些子视图是覆盖的兄弟,并让父UIView手动调用“do”通过命中测试的每个子视图的方法。这些兄弟视图中的每一个都可以返回BOOL值,以确定是否中止通知其他兄弟姐妹或继续链。

如果你发现自己经常使用这个模式,可以考虑在UIView上添加一个类别方法,它封装了命中测试并要求视图执行选择。

我的原始答案

通过一些手工操作,您可以自己连接在一起。我必须这样做,它对我有用,因为我有一个经常重复的用例(按钮上的叠加视图),在这里创建一些自定义类是有意义的。如果您的情况类似,其中一种技术就足够了。

选项1: 如果叠加层不需要做任何事情,只需看起来很漂亮,请让它完全使用userInteractionEnabled = NO选择退出触摸处理。这将使触摸事件进入它的父UIView(它是覆盖的那个)。

选项2: 让叠加层吸收触摸事件(默认情况下),然后调用父UIView上的方法,指示触摸或某个手势被识别,这就是它的内容。这样,即使其他人进行了拦截,叠加层后面的UIView仍然会对触摸识别起作用。

使用选项2,它更适合简单的UIControlEvent类型,例如UIControlEventTouchDownUIControlEventTouchUpInside。在我的情况下(一个自定义的UIButton子类,在它上面有一个自定义叠加视图),我将按下触摸并将按钮上的事件触摸到两个单独的方法。如果按钮本身发生触碰或触摸内部事件,则会触发这些触发。但是,如果我需要模拟按钮按下发生,它们也是我可以从叠加视图调用的钩子。

根据您的需要,您可以在叠加层和它的父UIView之间建立一个已知的协议,或者只是让覆盖层非正式地测试UIView,并在调用respondsToSelector:之前使用performSelector:检查您希望调用的自定义方法,如果UIView未被覆盖覆盖,则会自动触发。