我正在 iPhone 上开发一个简单的游戏,我从一个基于 View 的应用程序开始,通过 UIViewController
我正在加载一个包含更多 的自定义
和一些 UIView
>UIViewUIImageView
。我想检测某些 UIImageView
上的触摸事件,但到目前为止我做不到。
我创建了第二个项目用于测试目的,并认为 UIImageView
在层次结构如下时处理触摸事件:
UIViewController
->UIView
->UIImageView
,
但是当它像:
UIViewController
->UIView
->UIView
->UIImageView
他们没有被发现。
注意事项:
- userInteractionEnabled
在所有情况下都是YES
- 我上面提到的所有 UIViews
和 UIImageViews
都是自定义子类。
当自定义 UIImageView
在 View 层次结构中变得更深时,您能想到为什么无法接收触摸事件的任何原因吗?
最佳答案
触摸需要经过漫长而迂回的路线才能到达目的地。正式地,它们沿着响应者链上升,从第一个响应者开始,然后从最深的包含触摸的 View 到它的 View Controller ,再到下一个包含触摸的 View ,等等。
但实际情况要复杂得多,因为在找到最深的包含触摸的 View 时,触摸本质上是通过调用 hitTest:withEvent 来“询问”该信息的最高级别 View :
方法。这允许某些 super View 劫持触摸,这可能非常有用,例如 UIScrollView
,它有时会在其 subview 知道发生了什么之前执行操作(滚动/缩放)。
这里有一些提示可以帮助确定 View 可能不响应触摸的原因:
- 覆盖
[hitTest:withEvent:
] 1在您的每个 View 和NSLog
被击中时查看响应者链正在考虑谁。 - 使用未记录的(因此在提交之前取出)
UIView
方法recursiveDescription
在运行时检查所有 View 的框架。默认情况下, View 显示超出其框架大小,因此它们可能看起来不错,但逻辑上的尺寸小于视觉上的尺寸——并且触摸响应基于逻辑(而非视觉)尺寸。 - 这听起来可能很愚蠢,但请仔细检查您的方法是否正确连接到您正在寻找的输出。例如,如果您希望在触摸
UIButton
时调用您的 - [MyClass buttonPressed] 方法,请仔细检查您是否添加了MyClass
实例并@selector(buttonPressed)
作为该按钮的目标/操作对。 - 如果这些都不起作用,请使用
NSLog
消息覆盖touchesBegan:withEvent:
以查看触摸在响应链上的哪个位置。
而且,您已经知道这一点,但要注意 userInteractionEnabled
标志!
希望这足以隔离问题。
关于iphone - 如何在 UIView 的深层层次结构中检测 UIImageView 上的触摸事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2546375/