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

时间:2010-03-30 15:18:07

标签: iphone objective-c uiimageview touch

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

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

  

UIView - > UIImageView - > UIViewController

但是当它像:

  

UIView - > UIView - > UIImageView - > userInteractionEnabled

未检测到它们。

注意:
  - YES在所有情况下均为UIViews   - 我上面提到的所有UIImageViewsUIImageView都是自定义子类。

您是否可以想到,当自定义{{1}}在视图层次结构中更深入时无法接收触摸事件?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

并且,您已经知道这一点,但请留意userInteractionEnabled旗帜!

希望这足以隔离问题。