I have a bunch of UIViews
stacked one upon the other(not nested). I want them all to react to touch, but it seems that the topmost view obscures the views beneath it, preventing them from receiving touch events.
At first i thought i’d catch all touch events with the topmost view, and then manually call
hitTest
, or pointInside
methods on all the underlying views, but i found out that both methods are somehow private(could it be?) and cannot be accessed.
Any ideas how to pull it off?
You can check if the touch is for your topmost view. If it doesn't you can call the same method of your superview. Something like [self.superview sameMethod:sameParameter].
Your topmost view has a method
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
Inside that method you are doing your logic right?
Inside the method can't you check if the touch received is at your topmost view with
UITouch *touch = [touches anyObject];
[touch locationInView:self];
And if it doesn't you pass it to the superView's same method using
[self.superview touchesEnded:touches withEvent:event];
Touches are sent to a single view. That view can then optionally pass them up the responder chain. If you want to handle touches to a collection of views you should have them forward those events up to the next responder and have a common parent of all of them (or their view controller since the controller is also part of the responder chain) handle those touches.
https://developer.apple.com/library/mac/documentation/General/Devpedia-CocoaApp-MOSX/Responder.html