Iphone 如何在UIView的深层层次结构中检测UIImageView上的触摸事件?
我正在iPhone上开发一个简单的游戏,我从一个基于视图的应用程序开始,通过Iphone 如何在UIView的深层层次结构中检测UIImageView上的触摸事件?,iphone,objective-c,uiimageview,touch,Iphone,Objective C,Uiimageview,Touch,我正在iPhone上开发一个简单的游戏,我从一个基于视图的应用程序开始,通过UIViewController我正在加载一个自定义UIView,其中包含更多的UIViews和一些UIImageViews。我想检测一些UIImageViews上的触摸事件,但目前为止我还无法检测到 我为测试目的创建了第二个项目,并计算出UIImageViews在层次结构如下时处理触摸事件: UIViewController->UIView->UIImageView 但是当它像: UIViewController->U
UIViewController
我正在加载一个自定义UIView
,其中包含更多的UIView
s和一些UIImageView
s。我想检测一些UIImageView
s上的触摸事件,但目前为止我还无法检测到
我为测试目的创建了第二个项目,并计算出UIImageView
s在层次结构如下时处理触摸事件:
UIViewController
->UIView
->UIImageView
但是当它像:
UIViewController
->UIView
->UIView
->UIImageView
它们没有被检测到
注:-
userInteractionEnabled
在所有情况下都是YES
-我上面提到的所有
UIViews
和UIImageViews
都是自定义子类
当自定义
UIImageView
在视图层次结构中变得更深时,您能想到为什么不能接收触摸事件吗 触摸需要一条漫长而迂回的路线才能到达目的地。正式地说,他们进入响应者链,从第一个响应者开始,然后从最深的触摸(包括视图)到其视图控制器,再到下一个向上触摸(包括视图),等等
但实际情况更为复杂,因为在查找最深的触摸(包括要访问的视图)时,触摸基本上通过调用hitTest:withEvent:
方法“询问”最高级别的视图以获取该信息。这允许一些超级视图劫持触摸,这可能非常有用,如在UIScrollView
中,它有时会在子视图知道发生了什么之前进行操作(滚动/缩放)
以下是一些有助于确定视图可能不响应触摸的提示:
- 在每个视图上覆盖
],并在它们被点击时覆盖[hitTest:withEvent:
,以查看响应者链中考虑的是谁NSLog
- 使用undocumented(因此在提交之前将其取出)
方法在运行时检查所有视图的框架。默认情况下,视图的显示超出其帧大小,因此它们可能看起来正常,但逻辑上的大小小于视觉上的大小——触摸会根据逻辑(而非视觉)大小进行响应UIView
- 这听起来可能很愚蠢,但请仔细检查您的方法是否正确连接到您要查找的输出。例如,如果您希望在触摸
时调用-[MyClass buttonPressed]方法,请仔细检查是否已将UIButton
实例和MyClass
添加为该按钮的目标/操作对@selector(buttonPressed)
- 如果这些都不起作用,请使用
消息覆盖NSLog
,以查看触摸在响应者链中的位置touchesbeated:withEvent:
userInteractionEnabled
标志
希望这足以隔离问题。首先感谢您的快速响应!我刚刚有时间检查一下你的建议。问题是我没有用
initWithFrame
初始化UIImageView。你的第二个技巧让我怀疑这就是问题所在:“视图默认显示超出其帧大小,因此它们可能看起来正常,但逻辑上的大小小于视觉上的大小——触摸响应基于逻辑(而非视觉)大小。”