在Core Animation层中处理鼠标的实用方法

时间:2009-12-07 18:30:04

标签: cocoa core-animation mouse

我开始使用核心动画,我开始想知道如何处理各种鼠标事件,例如

  1. 鼠标输入CALayer
  2. 鼠标退出CALayer
  3. 鼠标点击CALayer
  4. 现在我只关注发送到自定义视图的mouseDown消息。根据文档,我应该使用-hitTest:(CGPoint)point调用我的根层(使用[customView setLayer:rootLayer]设置的那个)。

    它应该返回树中由point指定的位置的最远层。所以我做了:

    [rootLayer hitTest:[event locationInWindow]]
    

    但它不起作用。如果我点击rootLayer似乎有效,否则只返回null。当然子图层被添加到rootLayer中(事实上它们被绘制)

    我错过了某种坐标转换吗?除此之外,它是处理鼠标点击的方式吗?

    要找到鼠标何时进入CALayer,我是否必须对鼠标的每次移动更新进行命中测试?

    提前致谢

2 个答案:

答案 0 :(得分:4)

您可能想看看我们如何在Core Plot framework内处理CALayers中的鼠标/触摸事件。我们在层次结构中使用各种CALayer子类建立了一个基本的响应链。最近我们添加了使用鼠标/触摸事件滚动图形的代码,作为如何使用这种交互的示例。

我自己使用了类似的东西,只是在主要图层托管视图中处理了鼠标点击处理。在该视图中,我重写了-mouseDown:并添加了类似于以下内容的代码:

CGPoint pointOfClick = NSPointToCGPoint([self convertPoint:[theEvent locationInWindow] fromView:nil]);
CALayer *hitLayer = [self.layer hitTest:pointOfClick];
if ( (hitLayer != nil) && [hitLayer isKindOfClass:[MyCustomLayer class]])
{
    [(MyCustomLayer *)hitLayer mouseDown];
}

MyCustomLayer类将是一个自定义CALayer子类,它响应mouseDown方法并对其自身进行一些鼠标单击处理。或者,您可以完全在图层托管视图的此方法中处理鼠标单击响应。

要确保的一件事是,如果你已经将CALayer子类化,那么如果传递的点位于图层的边界内,它的-containsPoint:方法仍会返回YES。否则,-hitTest:将忽略该层。

答案 1 :(得分:3)

您需要将locationInWindow转换为包含视图的坐标系。因此,如果您的视图名为customView,则可以执行此操作:

[rootLayer hitTest:[customView convertPoint:[event locationInWindow] fromView:nil]];

CALayer没有获得自己的事件通知,因此处理事件的唯一方法是在包含视图中处理它们。