我正在开发 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/