我有一个在根层和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 A
或LAYER B
?
答案 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。
我迷上了这个棘手的几个小时。