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


12

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

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

3

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

有关此点的更多详细信息,请参见this S.O. answer


1

我了解你正在寻找的期望行为Joey - 我还没有在API中找到支持这种自动消息传递的兄弟姐妹视图的链式行为。

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

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

我原来的答复

手工工作的一点点,就可以连接到一起这个自己。我必须这样做,并且它对我很有用,因为我有一个经常重复的用例(一个按钮上的覆盖视图),创建一些自定义类是有意义的。如果你的情况相似,其中一种技术就足够了。

选项1: 如果覆盖不需要做任何事情,但看起来很漂亮,有它退出触摸与userInteractionEnabled = NO完全处理的。这将使触摸事件转到它的父UIView(它是覆盖层)。

选项2: 有覆盖吸收触摸事件(因为它会默认设置),然后调用上的指示触摸或特定手势被认定父UIView的一个方法,这里是它是什么。这样,叠加层后面的UIView仍然会对触摸识别起作用,即使其他人进行了拦截。

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

根据您的需求,你可以有覆盖层之间的已知协议和它的父UIView的或只是有覆盖非正式测试的UIView,具有respondsToSelector:检查就可以调用performSelector:与要叫那会自定义方法之前如果UIView没有覆盖,它会自动触发。