2010-03-30 94 views
3

我正在iPhone上开发一个简单的游戏,我开始使用基于视图的应用程序,并且通过UIViewController我加载了一个包含更多UIView和某些UIImageView s的自定义UIView。我想检测一些UIImageView上的触摸事件,但目前为止我还没有做到。如何检测UIViews深层次内的UIImageView上的触摸事件?

我已经创建了用于测试的第二个项目,并想通UIImageView S手触摸事件时的层次结构是这样的:

UIViewController - >UIView - >UIImageView

但是当它就像:

UIViewController - >UIView - >UIView - >UIImageView

没有检测到它们。

注:
- userInteractionEnabled在所有情况下
YES - 所有UIViewsUIImageViews我上面提的是自定义的子类。

你能想到任何原因:当自定义UIImageView在视图层次中变得更深时,无法接收触摸事件?

回答

4

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

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

这里有一些提示,以帮助确定为什么一个视图可能不会响应触摸:在你的每一个意见和NSLog

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

而且,您已经知道这一点,但请注意标记为userInteractionEnabled

希望这足以解决问题。

+2

首先感谢您的快速响应! 我只是有时间来检查你的提示。问题是我没有用'initWithFrame'初始化UIImageView。这是你的第二个提示,让我怀疑这是问题所在:“视图默认显示超出其框架大小,所以它们可能看起来不错,但在逻辑上比视觉尺寸更小 - 触摸响应基于逻辑(不是视觉)尺寸。“ – jester 2010-04-01 07:31:47