CALayer hitTest与子层

时间:2013-02-18 15:49:14

标签: objective-c core-animation calayer hittest

我有一个在根层和2个CALayer子类组成的结构。这两层也包含一层。

这是一个方案:

ROOT LAYER 
    |
    |------- LAYER A
    |           |---------BG
    |
    |
    |--------LAYER B
                |---------BG

如果我在hitTest上调用ROOT LAYER方法,它会将最内层返回到层次结构中。因此,如果用户点击LAYER A,我会获得BG的{​​{1}}。

LAYER A

如何停止响应者链并直接从发送到//In this example hitResult will contains the BG of LAYER A or the BG of LAYER B CALayer *hitResult = [rootLayer hitTest:point)]; 的HitTest获取LAYER ALAYER B

2 个答案:

答案 0 :(得分:5)

如果这些图层是您自己的CALayer子类,则可以覆盖hitTest:containsPoint:以在那里执行您自己的逻辑。

覆盖containsPoint:并在背景图层中返回NO将阻止他们从其超级层hitTest:实施中退回。

或者,您可以覆盖第A层和第B层中的hitTest:,如果它们包含该点,则返回self

答案 1 :(得分:0)

仅作记录,请注意,如果您设置z刻度为空,则图层不再通过点击测试。

// BG layer won't receive clicks
bgLayer.transform = CATransform3DMakeScale(1, 1, 0)

这可能是不使用子类而使图层不活动的一种方法,但是我想Apple可以随时更改此行为,所以我不推荐这样做。

对于那些可能想知道子图层为何不再获得点击的人,我还是放弃了这个答案。只要确保您在任何缩放比例下以sz传递1。

我迷上了这个棘手的几个小时。