cocoa - 为什么必须使用 CALayer 的presentationLayer 来进行 HitTest ?

标签 cocoa cocoa-touch core-animation calayer

我正在开发 Cocoa Touch 应用程序,并尝试通过确定 View 层的哪个子层被触摸来处理触摸。我的 Controller 的代码如下所示:

CALayer *hitLayer = [self.view.layer hitTest:point];

这不起作用。如果我点击子层的底部而不是顶部,它就会起作用。经过一小时的胡思乱想和谷歌搜索后,我终于发现如果使用表示层而不是层本身来进行 HitTest ,它是有效的:

CALayer *hitLayer = [self.view.layer.presentationLayer hitTest:point];

所以,我已经解决了我的问题,但我的问题是:为什么?

我已阅读核心动画指南,并且了解演示树和渲染树可能与对象模型树不同。但我不明白为什么演示树(显然)会有不同的 HitTest 行为。表示树和对象模型不会有相同的框架、边界等吗?

最佳答案

根据CALayer documentation ,在向用户呈现的内容方面,模型和呈现树之间似乎存在差异(取决于正在进行的动画)。对于 HitTest ,在presentationLayer方法中有一个引用:

For example, sending a hitTest: message to the presentationLayer will query the presentation values of the layer tree.

所以我怀疑只有表示层具有正确的几何信息来执行 HitTest 。

关于cocoa - 为什么必须使用 CALayer 的presentationLayer 来进行 HitTest ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2199171/

相关文章:

cocoa - 使 MAAttachedWindow 可调整大小而不反弹?

ios - 在 UITabBarController 之间传递 UIImage

iphone - 向模态视图 Controller 的工具栏添加标题的正确方法?

iphone - 如何在 UIImageView 实例内绘制一个点?

ios - 多个 CALayer 动画同时执行

ios - 无法看到 View Controller 的属性

objective-c - makeKeyAndOrderFront 也不做

objective-c - 字典值字典中的 iPhone NSArray

iphone - 我什么时候应该在 Objective c 中使用 assign ?

objective-c - 可以在 c 结构中使用 CATextLayer 吗?