k06a
k06a

Reputation: 18755

MKMapView to deny single touch panning

I need to allow two-finger pinch/rotate/panning and deny single-finger panning.

I've tried some ways to achieve this:

for (UIPanGestureRecognizer *pan in mapView.gestureRecognizers) {
    if ([pan isKindOfClass:[UIPanGestureRecognizer class]]) {
        if ([pan minimumNumberOfTouches] < 2) {
            [pan setMinimumNumberOfTouches:2];
        }
    }
}

But this not works. Maybe some kind of UIGestureRecognizer failing dependency?

Upvotes: 0

Views: 44

Answers (1)

k06a
k06a

Reputation: 18755

Just found nice solution:

self.twoFingerPan = [[UIPanGestureRecognizer alloc] init];
self.twoFingerPan.maximumNumberOfTouches = 1;
self.twoFingerPan.delegate = self;
[self addGestureRecognizer:self.twoFingerPan];

...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if (gestureRecognizer == self.twoFingerPan &&
        [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] &&
        (otherGestureRecognizer.view == self.mapView ||
         otherGestureRecognizer.view.superview == self.mapView)) {
        return YES;
    }
    return NO;
}

And addition to allow any outer scrolling:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if (gestureRecognizer == self.twoFingerPan &&
        [otherGestureRecognizer.view isKindOfClass:[UIScrollView class]]) {
        return YES;
    }
    return NO;
}

Upvotes: 1

Related Questions