代码之家  ›  专栏  ›  技术社区  ›  Kristopher Johnson

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

  •  6
  • Kristopher Johnson  · 技术社区  · 15 年前

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

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

    这不管用。如果我在下层的底部敲打,但在顶部敲打就不行了。经过一个小时的头发拉扯和谷歌搜索,我终于发现,如果使用表示层而不是层本身进行点击测试,它是有效的:

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

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   Laurent Etiemble    15 年前

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

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

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

        2
  •  3
  •   Murali Raghuram    13 年前

    克里斯托弗,我也有类似的问题。但是,当我将该点转换为“超级图层”或“超级视图”坐标系时,它工作得非常好。我没有使用表示层。

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

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