使用 UIGestureRecognizer 传递奇怪的 ios 触摸事件

Posted

技术标签:

【中文标题】使用 UIGestureRecognizer 传递奇怪的 ios 触摸事件【英文标题】:weird ios touch event passing with UIGestureRecognizer 【发布时间】:2012-09-06 08:05:32 【问题描述】:

您好,我在 ios 自定义视图中观察到一些奇怪的东西,我在自定义视图中有一个按钮,我正在寻找文档或您的答案来解释为什么我有这个观察结果

我有一个自定义视图(UIView 的子类),它包含一个简单的按钮,我通过 addTarget:Action 将按钮触摸事件与 UITouchUpInside 绑定,我只是将它选择器绑定到一个简单的方法,即 NSLog 一条消息

如果您显示自定义视图并点击按钮,您可以在控制台中看到消息,一切正常。

但是,如果您将 UIGestureReognizer 添加到自定义视图并运行它,当您单击按钮时,它不再打印消息,为什么? 我做了更深入的调查,并通过查看自定义视图中的 hittest 方法(视图包含按钮)(我覆盖它,但我没有做任何事情,我只是再次调用 super),hittest 正在返回正确的视图,即当我单击按钮时,自定义视图的 hittest 方法正在返回 UIButton

我不明白这里的事件链,有人可以指出解释这一点的文档吗?

在我看来,当您将 regonizer 添加到按钮的容器视图时,由于某种原因,按钮不知道如何处理该事件,因此它要求其超级视图(在这种情况下为自定义视图)来处理它, 但为什么??我已经通过 UITouchUPInside 将事件处理程序绑定到按钮

请帮我理解这个

【问题讨论】:

【参考方案1】:

将识别器的cancelsTouchesInView 属性设置为NO

【讨论】:

嗨亚当,谢谢您的回复,它有效。但你能解释一下到底发生了什么吗?我想我要问的是,当我有如上所述的手势识别器时,当我触摸按钮时,谁先处理触摸?自定义视图容器(具有识别器)或按钮?当触摸事件发生时,hittest 建议按钮是第一个人,但您的解决方案似乎表明容器视图正在阻止事件? 识别器首先处理它,你决定是否通过它。

以上是关于使用 UIGestureRecognizer 传递奇怪的 ios 触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

将 UIGestureRecognizer 的所有事件从一个 UIView 传递到另一个 UIView(子视图)[重复]

从 UITouch 对象调用 UIGestureRecognizer

UIGestureRecognizer

使用 UIGestureRecognizer 旋转瓶子

使用 UIGestureRecognizer 模拟按钮单击

如何用 UIGestureRecognizer 替换 TouchesBegan