我了解您正在寻找 Joey 的期望行为 - 我在 API 中没有找到支持这种带有兄弟视图的自动消息传递链上行为的东西。
我最初在下面写的只是通知父 UIView 触摸。这仍然适用,但我相信您需要更进一步,让父 UIView 使用 Sergio 在每个作为叠加层兄弟的子视图上描述的命中测试技术,并让父 UIView 手动调用“做在通过命中测试的每个子视图上都有一些东西”方法。这些兄弟视图中的每一个都可以返回一个 BOOL 值,以确定是中止通知其他兄弟还是继续链。
如果您发现自己经常使用这种模式,请考虑在 UIView 上添加一个类别方法,该方法封装了命中测试并要求视图执行选择器。
我的原始答案
通过一些手工工作,您可以自己将其连接在一起。我不得不这样做,它对我有用,因为我有一个经常重复的用例(按钮上的覆盖视图),在其中创建一些自定义类是有意义的。如果您的情况相似,则其中一种技术就足够了。
选项 1:
如果覆盖不需要做任何事情,但看起来很漂亮,让它完全退出触摸处理userInteractionEnabled = NO
。这将使触摸事件转到它的父 UIView(它是覆盖的那个)。
选项 2:
让覆盖层吸收触摸事件(默认情况下),然后在父 UIView 上调用一个方法,指示触摸或某个手势已被识别,这就是它的含义。这样,即使其他人进行了拦截,覆盖层后面的 UIView 仍然可以对触摸识别起作用。
使用选项 2,它更适合简单UIControlEvent
类型,例如UIControlEventTouchDown
和UIControlEventTouchUpInside
. 在我的例子中(一个自定义的UIButton
子类,上面有一个自定义的覆盖视图),我会将按钮上的 touch down 和 touch up 事件连接到两个单独的方法。如果按钮本身发生了 touch down 或 touch up inside 事件,它们就会触发。但是,如果我需要模拟发生按钮按下,它们也是我可以从覆盖视图中调用的钩子。
根据您的需要,您可以在叠加层和它的父 UIView 之间有一个已知的协议,或者只是让叠加层非正式地测试 UIView,respondsToSelector:
在调用performSelector:
它之前使用您想要调用的自定义方法进行检查,如果 UIView 会自动触发未被覆盖。