Search code examples
objective-ceventsuiviewtouchstacked

Receiving touch events on more then one UIView simultaneously


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?


Solution

  • 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];