Search code examples
iosuitapgesturerecognizer

Avoid Passing Touch Event to the Background View Behind


View

  • StackView (vertical)
    • Purple (View)
    • Green (View)
    • Orange (View)

View has a tap gesture recognizer. It prints "this" plus a random int.

If I tap Purple, Green or Orange, it still prints "this".

How can I disable taps on the colored boxes? I tried turning off the 'User Interaction Enabled' setting on the boxes.

screenshot of my views


Solution

  • Because the stack view is a sub-view of View and not added over the top (like a presented view controller), its going to receive the touch events like you're experiencing. Your view controller needs to adopt the UIGestureRecognizerDelegate protocol, then you need to set the gesture's delegate to the view controller (most likely you just need to set it to "self") and then implement the following function:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        //the below will return false if the touch's view is not the gesture recognizer's view
        return touch.view == gestureRecognizer.view
    }
    

    The code example was referenced from: UITapGestureRecognizer tap on self.view but ignore subviews