How to use UIGestureRecognizerDelegate?

DefinitelyNotAPlesiosaur picture DefinitelyNotAPlesiosaur · Jun 27, 2015 · Viewed 9.7k times · Source

My Setup

I'm trying to replicate Google Now's card interface.

I have a UIView which is a subview of (inside) a UIScrollView. Both are controlled from the same UIViewController. The UIView has a UIPanGestureRecognizer attached to it by the UIViewController.

The UIScrollView is used to scroll up and down. The UIPanGestureRecognizer is used to swipe away the UIView.

The Problem

I can't scroll when I'm touching the UIView (the card)

The Question

How do I implement UIGestureRecognizerDelegate to enable gestureRecognizer(_:shouldRecognizeSimultaneouslyWithGestureRecognizer:) on the card so that it'll let the UIScrollView scroll?

I've spent several hours trying to figure this out, and I would be incredibly thankful for help.

Answer

DefinitelyNotAPlesiosaur picture DefinitelyNotAPlesiosaur · Jun 30, 2015

In case anyone is wondering how to do this, here's the answer:

When you declare your class, add UIGestureRecognizerDelegate after the class it subclasses. Here's what that looks like in my case:

class CardViewController: UIViewController, UIGestureRecognizerDelegate

Next, you add this function to the body of the UIViewController:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

And finally, you do this to the UIPanGestureRecognizer:

somePanGestureRecognizer.delegate = self