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

时间:2010-02-04 11:17:04

标签: cocoa cocoa-touch core-animation calayer

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

根据CALayer documentation,模型和表示树之间似乎存在关于呈现给用户的内容(取决于正在进行的动画)的差异。对于命中测试,presentationLayer方法中有一个参考:

  

例如,发送一个hitTest:   消息到presentationLayer会   查询的表示值   层树。

因此我怀疑只有表示层具有正确的几何信息才能执行命中测试。

答案 1 :(得分:3)

克里斯托弗,我也有一个非常相似的问题。然而,当我将点转换为超级视图或超级视图坐标系时,它完美地工作。我没有使用表示层。

    //Identify the touch point in the view. Using UITapRecognizer
CGPoint loc = [recognizer locationInView:recognizer.view];

//convert the point to superview co-ordinates and then identify the layer using hit test.
CALayer *layer = [self.layer hitTest:[self convertPoint:loc toView:self.superview]];

这会给我一个被触摸的图层,至少目前是这样。如果您认为这是一种错误的方法,请告诉我们,我应该使用presentation-layer。