我开始使用核心动画,我开始想知道如何处理各种鼠标事件,例如
CALayer
CALayer
CALayer
现在我只关注发送到自定义视图的mouseDown
消息。根据文档,我应该使用-hitTest:(CGPoint)point
调用我的根层(使用[customView setLayer:rootLayer]
设置的那个)。
它应该返回树中由point指定的位置的最远层。所以我做了:
[rootLayer hitTest:[event locationInWindow]]
但它不起作用。如果我点击rootLayer
似乎有效,否则只返回null
。当然子图层被添加到rootLayer中(事实上它们被绘制)
我错过了某种坐标转换吗?除此之外,它是处理鼠标点击的方式吗?
要找到鼠标何时进入CALayer,我是否必须对鼠标的每次移动更新进行命中测试?
提前致谢
答案 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
没有获得自己的事件通知,因此处理事件的唯一方法是在包含视图中处理它们。