Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在UIView的深层层次结构中检测UIImageView上的触摸事件?_Iphone_Objective C_Uiimageview_Touch - Fatal编程技术网

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

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

我正在iPhone上开发一个简单的游戏,我从一个基于视图的应用程序开始,通过
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
    方法在运行时检查所有视图的框架。默认情况下,视图的显示超出其帧大小,因此它们可能看起来正常,但逻辑上的大小小于视觉上的大小——触摸会根据逻辑(而非视觉)大小进行响应
  • 这听起来可能很愚蠢,但请仔细检查您的方法是否正确连接到您要查找的输出。例如,如果您希望在触摸
    UIButton
    时调用-[MyClass buttonPressed]方法,请仔细检查是否已将
    MyClass
    实例和
    @selector(buttonPressed)
    添加为该按钮的目标/操作对
  • 如果这些都不起作用,请使用
    NSLog
    消息覆盖
    touchesbeated:withEvent:
    ,以查看触摸在响应者链中的位置
而且,您已经知道这一点,但是请注意
userInteractionEnabled
标志


希望这足以隔离问题。

首先感谢您的快速响应!我刚刚有时间检查一下你的建议。问题是我没有用
initWithFrame
初始化UIImageView。你的第二个技巧让我怀疑这就是问题所在:“视图默认显示超出其帧大小,因此它们可能看起来正常,但逻辑上的大小小于视觉上的大小——触摸响应基于逻辑(而非视觉)大小。”