为什么必须使用CALayer的presentationLayer进行命中测试?

Kri*_*son 6 cocoa cocoa-touch core-animation calayer

我正在研究Cocoa Touch应用程序,并试图通过确定触摸视图层的哪个子层来处理触摸.我的控制器代码看起来像这样:

CALayer *hitLayer = [self.view.layer hitTest:point];
Run Code Online (Sandbox Code Playgroud)

这不起作用.如果我点击子层的底部,而不是顶部,它会起作用.经过一个小时的拉毛和谷歌搜索后,我终于发现,如果使用表示层进行命中测试而不是图层本身,它会起作用:

CALayer *hitLayer = [self.view.layer.presentationLayer hitTest:point];
Run Code Online (Sandbox Code Playgroud)

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

我已经阅读了核心动画指南,我知道表示树和渲染树可以与对象模型树不同.但我不明白为什么表示树(显然)会有不同的命中测试行为.表示树和对象模型不会具有相同的帧,边界等吗?

Lau*_*ble 4

根据CALayer 文档,模型和演示树之间在向用户呈现的内容方面似乎存在差异(取决于正在进行的动画)。对于命中测试,方法中有参考presentationLayer

例如,向presentationLayer发送hitTest:消息将查询层树的presentation值。

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