12

我试图touchesBegan在覆盖到父级的情况下处理触摸事件,UIView但也允许触摸输入传递到UIView下面的兄弟姐妹。我预计会有一些直接的方式来处理一个触摸事件,然后说“现在把它发送给下一个响应者,就好像这个不存在一样”,但我能找到的只是nextResponder似乎正在回馈的方法我的叠加视图的父级。然后,该父级并没有真正将其传递给该覆盖视图的下一个兄弟,因此我不确定如何执行看似简单的任务,通常通过触摸回调完成,该回调获取 True 或 False 返回值来告诉它是否继续处理小部件层次结构。

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

4

2 回答 2

3

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

另请查看此 SO answer以了解有关这一点的更多详细信息。

于 2011-12-24T21:38:33.733 回答
1

我了解您正在寻找 Joey 的期望行为 - 我在 API 中没有找到支持这种带有兄弟视图的自动消息传递链上行为的东西。

我最初在下面写的只是通知父 UIView 触摸。这仍然适用,但我相信您需要更进一步,让父 UIView 使用 Sergio 在每个作为叠加层兄弟的子视图上描述的命中测试技术,并让父 UIView 手动调用“做在通过命中测试的每个子视图上都有一些东西”方法。这些兄弟视图中的每一个都可以返回一个 BOOL 值,以确定是中止通知其他兄弟还是继续链。

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

我的原始答案

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

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

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

使用选项 2,它更适合简单UIControlEvent类型,例如UIControlEventTouchDownUIControlEventTouchUpInside. 在我的例子中(一个自定义的UIButton子类,上面有一个自定义的覆盖视图),我会将按钮上的 touch down 和 touch up 事件连接到两个单独的方法。如果按钮本身发生了 touch down 或 touch up inside 事件,它们就会触发。但是,如果我需要模拟发生按钮按下,它们也是我可以从覆盖视图中调用的钩子。

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

于 2012-01-01T15:20:08.860 回答