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

我试图处理触摸事件touchesBegan覆盖到父UIView但也允许触摸input传递到兄弟UIView底下。 我预计会有一些直接的方式来处理触摸事件,然后说“现在发送给下一个响应者,就好像这个不存在”,但我能find的是下一个nextResponder方法,它似乎是给将父项返回到覆盖视图。 那父母是不是真的把它传递到覆盖视图的下一个兄弟,所以我卡住不确定如何做什么似乎是一个简单的任务,通常是通过触摸callback获得一个真或假返回值来告诉它是否继续处理小部件层次结构。

我错过了什么明显的?

迟到的答案,但我认为你会更好的重写hitTest:withEvent:而不是touchesBegan 。 在我看来, touchesBegan是一个相当“高级”的方法,只是做一件简单的事情,所以如果事件进一步传播的话,你不能在这个层次上改变。 这是正确的地方是hitTest:withEvent:

也看看这个SO的答案关于这一点的更多细节。

我知道你期待的行为Joey – 我还没有发现在API中支持这种自动消息链上的行为与兄弟的意见。

我最初在下面写的是关于只通知父母UIView关于触摸。 这仍然适用,但我相信你需要更进一步,并有父UIView使用命中testing技术,塞尔吉奥描述的每个子视图是同胞的兄弟姐妹,并有父UIView手动调用一个“做它的每个子视图都通过了命中testing。 这些同级视图中的每一个都可以返回一个布尔值,以决定是否中止通知其他兄弟或者继续连锁。

如果你发现自己使用这个模式很多,可以考虑在UIView上添加一个类别方法来封装命中testing和请求视图来执行一个select器。

我的原始答复

通过一点点手动工作,你可以自己把它连接起来。 我必须这样做,而且它对我来说是有效的,因为我有一个经常重复的用例(一个button上的重叠视图),创build一些自定义类是有意义的。 如果你的情况相似,其中一种技术就足够了。

选项1:如果叠加层不需要做任何事情,但看起来很漂亮,那么使用userInteractionEnabled = NO完全可以select不触摸处理。 这将使触摸事件转到它的父UIView(它是一个覆盖)。

选项2:让覆盖层吸收触摸事件(如默认情况下那样),然后在父UIView上调用一个方法来指示触摸或某种手势已被识别,这就是它的原理。 这样,叠加后面的UIView仍然可以在触摸识别上进行操作,即使其他人进行了拦截。

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

根据你的需要,你可以在覆盖层和它的父UIView之间有一个已知的协议,或者只是非正式地用UIView覆盖testing,在调用performSelector:之前用一个respondsToSelector:检查performSelector:在它上面用你想调用的自定义方法自动如果UIView不覆盖覆盖。