Reputation: 16430
I have a structure composed on a root layer and 2 CALayer subclass. These 2 layers contain a layer too.
Here a scheme:
ROOT LAYER
|
|------- LAYER A
| |---------BG
|
|
|--------LAYER B
|---------BG
If I call the hitTest
method on the ROOT LAYER
it returns the most inner layer into the hierarchy. So if user clicks over LAYER A
I get the BG
of LAYER A
.
//In this example hitResult will contains the BG of LAYER A or the BG of LAYER B
CALayer *hitResult = [rootLayer hitTest:point)];
How can I stop the responder chain and get directly LAYER A
or LAYER B
from a HitTest sent to ROOT LAYER
?
Upvotes: 3
Views: 2838
Reputation: 2737
Just for the record, note that if you set a null z scale, layers don't pass the hit test anymore.
// BG layer won't receive clicks
bgLayer.transform = CATransform3DMakeScale(1, 1, 0)
It can be a way to make layers inactive without subclassing, but I guess Apple is free to change this behaviour anytime, so I won't recommend it.
I drop this answer anyway for those who may wonder why sublayers don't get clicks anymore. Just get sure you pass 1 in sz in any scaling.
I have myself lost few hours with this tricky one.
Upvotes: 1
Reputation: 56625
If these layers are your own CALayer subclasses then you can override hitTest:
or containsPoint:
to do your own logic there.
Overriding containsPoint:
and returning NO
in your background layers will stop them from being returned from their superlayers hitTest:
implementation.
Alternatively you could override hitTest:
in Layer A and Layer B and return self
if they contain the point.
Upvotes: 6