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

标签 iphone objective-c uiimageview touch

我正在 iPhone 上开发一个简单的游戏,我从一个基于 View 的应用程序开始,通过 UIViewController 我正在加载一个包含更多 的自定义 UIView >UIView 和一些 UIImageView。我想检测某些 UIImageView 上的触摸事件,但到目前为止我做不到。

我创建了第二个项目用于测试目的,并认为 UIImageView 在层次结构如下时处理触摸事件:

UIViewController -> UIView -> UIImageView,

但是当它像:

UIViewController -> UIView -> UIView -> UIImageView

他们没有被发现。

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

当自定义 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/

相关文章:

iphone - <加速/加速.h> "file not found"

ios - 在不遵守 iPhone 铃声/静音开关的情况下在后台播放声音

iphone - 您在编写 Objective-C 和 Cocoa 时使用了哪些最佳实践?

ios - 将 UIView 坐标从纵向转换为横向,反之亦然

ios - 增加 UIImageView 高度的最简单方法?

iphone - OpenGL ES 运行多个着色器

ios - 为应用程序添加试用期。我应该在 Swift (iOS) 中使用 Timer 还是 DispatchQueue?

objective-c - 重音不敏感的字符串比较?

swift - 绘制后 uiimageview 中的 ContentMode 发生变化

ios - 将图像分配给表格单元格中的 uiimageview