繁体   English   中英

如何在UIViews的深层次结构中检测UIImageView上的触摸事件?

[英]How can I detect touch events on a UIImageView inside a deep hierarchy of UIViews?

我正在iPhone上开发一个简单的游戏,我开始使用基于View的应用程序,通过UIViewController我正在加载一个包含更多UIView和一些UIImageView的自定义UIView 我想检测一些UIImageView上的触摸事件,但到目前为止我还没能。

我已经创建了第二个用于测试目的的项目,并且认为UIImageView在层次结构如下时处理触摸事件:

UIViewController - > UIView - > UIImageView

但是当它像:

UIViewController - > UIView - > UIView - > UIImageView

他们没有被发现。

笔记:
- userInteractionEnabled在所有情况下都为YES
- 我上面提到的所有UIViewsUIImageViews都是自定义子类。

您能想到任何原因,当自定义UIImageView在视图层次结构中变深时无法接收触摸事件吗?

接触需要一条漫长而迂回的路线才能到达目的地。 正式地,他们沿响应链上行,从第一响应者开始,然后从最深触摸视图到视图控制器,到下一个触摸 - 包括视图等。

但实际情况更加复杂,因为在找到最深入的触摸视图时,触摸实际上是通过调用hitTest:withEvent:方法“询问”该信息的最高级别视图。 这允许一些超级视图劫持触摸,这可能非常有用,如UIScrollView ,它有时会在其子视图知道发生了什么之前做事情(滚动/缩放)。

以下是一些提示,可帮助确定视图可能无法响应触摸的原因:

  • 在每个视图和NSLog上覆盖[hitTest:withEvent: ] 1 ,当它们被击中时,看看谁正在考虑响应者链。
  • 使用未记录的(因此在提交之前采用它) UIView方法recursiveDescription来检查运行时所有视图的帧。 默认情况下,视图显示超出其帧大小,因此它们可能看起来没问题,但逻辑上比视觉上更小 - 并且触摸响应基于逻辑(非可视)大小。
  • 这可能听起来很愚蠢,但请仔细检查您的方法是否正确连接到您正在寻找的输出。 例如,如果您希望在触摸UIButton时调用 - [MyClass buttonPressed]方法,请仔细检查您是否已将MyClass实例和@selector(buttonPressed)添加为该按钮的目标/操作对。
  • 如果这些都不起作用,请覆盖touchesBegan:withEvent: with NSLog消息,以查看响应链上的触摸位置。

并且,您已经知道这一点,但请注意userInteractionEnabled标志!

希望这足以隔离问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM