我正在iPhone上开发一个简单的游戏,我开始使用基于视图的应用程序,并通过UIViewController
我正在加载包含更多UIView
和一些UIView
的自定义UIImageView
UIImageView
秒。我想检测一些UIImageView
上的触摸事件,但到目前为止我还没能。
我已经创建了第二个用于测试目的的项目,并认为UIViewController
在层次结构如下时处理触摸事件:
UIView
- >UIImageView
- >UIViewController
,
但是当它像:
UIView
- >UIView
- >UIImageView
- >userInteractionEnabled
未检测到它们。
注意:
- YES
在所有情况下均为UIViews
- 我上面提到的所有UIImageViews
和UIImageView
都是自定义子类。
您是否可以想到,当自定义{{1}}在视图层次结构中更深入时无法接收触摸事件?
答案 0 :(得分:4)
接触需要一条漫长而迂回的路线才能到达目的地。正式地,他们沿响应链上行,从第一响应者开始,然后从最深触摸视图到视图控制器,到下一个触摸 - 包括视图等。
但实际情况更复杂,因为在找到最深入的触摸视图时,触摸通过调用hitTest:withEvent:
方法基本上“询问”该信息的最高级别视图。这允许一些超级视图劫持触摸,这可能非常有用,如UIScrollView
,它有时会在其子视图知道发生了什么之前做事情(滚动/缩放)。
以下是一些提示,可帮助确定视图可能无法响应触摸的原因:
[hitTest:withEvent:
] 1,并在NSLog
被点击时查看谁正在考虑响应者链。UIView
方法recursiveDescription
来检查运行时所有视图的帧。默认情况下,视图显示超出其框架大小,因此它们可能看起来没问题,但逻辑上的尺寸小于视觉尺寸 - 并且触摸会根据逻辑(非视觉)尺寸进行响应。UIButton
时调用 - [MyClass buttonPressed]方法,请仔细检查您是否已将MyClass
实例和@selector(buttonPressed)
添加为该按钮的目标/操作对。touchesBegan:withEvent:
消息覆盖NSLog
,以查看响应链中的触摸位置。并且,您已经知道这一点,但请留意userInteractionEnabled
旗帜!
希望这足以隔离问题。