6

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

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

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

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

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

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

4

2 回答 2

4

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

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

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

于 2010-02-04T16:10:26.103 回答
3

Kristopher,我也有一个非常相似的问题。但是,当我将点转换为超级图层或超级视图坐标系时,它工作得很好。我没有使用表示层。

    //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]];

这让我返回了被触摸的图层,至少现在是这样。如果您认为这是一种错误的方法,请告诉我们,我应该改用表示层。

于 2011-09-02T18:34:55.543 回答