How to ignore touch events and pass them to another subview's UIControl objects? How to ignore touch events and pass them to another subview's UIControl objects? ios ios

How to ignore touch events and pass them to another subview's UIControl objects?


Probably the best way to do this is to override hitTest:withEvent: in the view that you want to be ignoring touches. Depending on the complexity of your view hierarchy, there are a couple of easy ways to do this.

If you have a reference to the view underneath the view to ignore:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{    UIView *hitView = [super hitTest:point withEvent:event];    // If the hitView is THIS view, return the view that you want to receive the touch instead:    if (hitView == self) {        return otherView;    }    // Else return the hitView (as it could be one of this view's buttons):    return hitView;}

If you don't have a reference to the view:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{    UIView *hitView = [super hitTest:point withEvent:event];    // If the hitView is THIS view, return nil and allow hitTest:withEvent: to    // continue traversing the hierarchy to find the underlying view.    if (hitView == self) {        return nil;    }    // Else return the hitView (as it could be one of this view's buttons):    return hitView;}

I would recommend the first approach as being the most robust (if it's possible to obtain a reference to the underlying view).


Swift answer:

You can create a UIView subclass, IgnoreTouchView. In a storyboard, set it on the VC's view(s) you want to pass through touches:

class IgnoreTouchView : UIView {    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {        let hitView = super.hitTest(point, with: event)        if hitView == self {            return nil        }        return hitView    }}

Note that you must set UserInteractionEnabled to true, for the UIView in question!


You could also disable user interaction so that touch events are ignored and are passed to the parent.

In Swift:

yourView.isUserInteractionEnabled = false