3

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

这里有一个方案:

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

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

//In this example hitResult will contains the BG of LAYER A or the BG of LAYER B
CALayer *hitResult = [rootLayer hitTest:point)]; 

如何停止响应者链并直接获取LAYER ALAYER B从发送到的 HitTest 获取ROOT LAYER

4

2 回答 2

6

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

在您的背景层中覆盖containsPoint:和返回NO将阻止它们从它们的超级层hitTest:实现中返回。

hitTest:或者,您可以在 A 层和 B 层中覆盖并self在它们包含该点时返回。

于 2013-02-19T12:46:21.467 回答
0

仅作记录,请注意,如果您设置了一个空 z 比例,图层将不再通过命中测试。

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

它可以是一种在不进行子类化的情况下使图层处于非活动状态的方法,但我猜 Apple 可以随时更改此行为,因此我不会推荐它。

对于那些可能想知道为什么子层不再获得点击的人,我无论如何都会放弃这个答案。只要确保在任何缩放中都通过 1 in sz 即可。

我自己在这个棘手的问题上浪费了几个小时。

于 2020-10-17T16:27:29.690 回答