Search code examples
iosuipangesturerecognizer

Gesture recognizer callback over multiple views


I have a custom UIView that consists of 9 equally-sized subviews. It essentially looks like a tic-tac-toe board.

I've added a UIPanGestureRecognizer to this custom view. Each time the user pans over one of the subviews, I want to take an action. For example, the user could pan over the first 3 (of the 9) subviews in one gesture, and in this case I'd want to take 3 actions.

I could try to do some fancy math and figure out the frame of each subview, then figure out when the gesture crosses from one subview to another. However, I feel like there should be a more elegant way to get a callback when a gesture touches a new UIView. Does a functionality like this exist?


Solution

  • I was able to find a more elegant way by using hitTest, which returns the lowest subview with user interaction enabled. I defined the callback for the pan gesture recognizer as such:

    var panSelected = Set<UILabel>()
    @objc func handlePan(recognizer: UIPanGestureRecognizer) {
        let view = recognizer.view
        let loc = recognizer.location(in: view)
        if let gridLabel = view?.hitTest(loc, with: nil) as? UILabel {
            if !panSelected.contains(gridLabel) {
                // my code here
            }
        }