Search code examples
iosswiftuicollectionviewuigesturerecognizeruipangesturerecognizer

When gestureRecognizerShouldBegin fires the numberOfTouches is zero


I have UICollectionView and decided to override gestureRecognizerShouldBegin function to be able to control the number of touches involved in collection scrolling.

So I want my UICollectionView to scroll with only one finger.

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    switch gestureRecognizer == self.panGestureRecognizer {
    case true:
        return gestureRecognizer.numberOfTouches == 1
    default:
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }
}

It works as expected on my iOS 10.3.1 device. But it doesn't on iOS 10.0.1, iOS 9.3.5.


Solution

  • The problem is that UICollectionView's UIPanGestureRecognizer might return zero touches when gestureRecognizerShouldBegin fires. So, if someone wants to control the number of touches allowed for UICollectionView scrolling the way I described above, he should be aware of the problem... or choose some other approach.

    The way it works correctly (almost):

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        switch gestureRecognizer == self.panGestureRecognizer {
        case true:
            return gestureRecognizer.numberOfTouches <= 1
        default:
            return super.gestureRecognizerShouldBegin(gestureRecognizer)
        }
    }