CALayer上的hitTest - 你如何找到被击中的实际图层?

时间:2011-11-24 15:51:11

标签: ios calayer

情况:需要找到用户触摸过的图层。

问题:Apple说我们应该使用[CALayer presentationLayer]进行命中测试,以便它代表当时屏幕上的实际内容(它捕捉动画中期等信息)。

...除了:presentationLayer不返回原始图层,它返回它们的副本......所以:hitTest将返回一个全新的CALayer实例,该实例与原版不同。

我们如何找到被击中的实际CALayer?

e.g。

CALayer* x = [CALayer layer];
CALayer* y = [CALayer layer];
[self.view.layer addSublayer: x];
[self.view.layer addSublayer: y];

...

CALayer* touchedLayer = [self.view.layer.presentationLayer hitTest:touchPoint];

...但是,触摸了Layer" x",或者它是" y"?

if( touchedLayer == x ) // this won't work, because touchedLayer is - by definition from Apple - a new object

2 个答案:

答案 0 :(得分:7)

亚当的回答是正确的,并帮助了我。这是我使用的代码,可以帮助其他人。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint touchPoint = [(UITouch*)[touches anyObject] locationInView:self];
    CALayer *touchedLayer = [self.layer.presentationLayer hitTest:touchPoint];  // is a copy of touchedLayer
    CALayer *actualLayer = [touchedLayer modelLayer];   // returns the actual layer
    NSLog (@"touchedLayer: %@", touchedLayer);
    NSLog (@"actualLayer: %@", actualLayer);
}

答案 1 :(得分:3)

啊!刚刚弄明白这一点,阅读一篇关于CALayer的另一个问题的邮件列表帖子。

在调用[CALayer presentationLayer]并使用图层树的“演示克隆”之后,您可以获取该树中的任何对象,并在其上调用[CALayer modelLayer]以获取原始参考对象在原始树中的相同位置

这个参考是稳定的(测试 - 它有效)。

Apple的文档有点......模糊不清......就这一个而言。他们暗示它“有时”会失败(“...results are undefined”) - 但现在对我来说已经足够了。