I'm having a strange problem with capturing drag/pan gestures on a GMSMapView through a Gesture Recognizer. This problem surfaced only after updating from GMS 1.2 to 1.3.1, where (quoting the documentation),
Touches are consumed more agressively by GMSMapView
I have a UIViewController holding a GMSMapView under its main view. I found GMSMapDelegate does not provide methods for handling drag/pan gestures, so I added a UIPanGestureRecognizer to the UIViewController, linked it to an IBAction selector, and set referencing outlet and outlet collection, as per the screenshot linked here: http://i.stack.imgur.com/gktoa.png
So any drag action would simply trigger the recognizeDragOnMap:
selector, as below:
-(IBAction)recognizeDragOnMap:(id)sender {
NSLog(@"recognizeDragOnMap");
UIGestureRecognizer *gestureRecognizer = (UIGestureRecognizer *)sender;
if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
NSLog(@"Still dragging");
return;
}
NSLog(@"DragEnded");
GMSCameraPosition *position;
if ((position = self.mapView.camera)) {
self.automaticCameraPositionChange = NO;
CLLocationCoordinate2D coordinate = [position targetAsCoordinate];
CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
[self.origin dragPinToLocation:location];
} else {
NSLog(@"No map camera");
}
}
This setup used to work perfectly under GMS 1.2.0. After the update, the GMSMapView responds to the gestures like it used to, however the method above never gets called!
Anyone have an idea what's up and/or how to fix it?
For version 1.4 or higher, you just have to set
consumesGesturesInView = NO
in your GMSUISettings object.If you do that, be aware that you will have to deal with events that could make your superview to do stuff when you just want to interact with the map... By that I mean, for example, that dragging a GMSMapView added to a scroll view will scroll the scroll view on drag!
As it turns out, a
GMSMapView
instance now owns aGMSBlockingGestureRecognizer
which gobbles up all gestures. So there were two choices:GMSMapView
(possibly breaking internal functionality that depends on it) (like this); orGoing with this second approach, the following code in the
UIViewController
'sviewDidLoad
made things go back to normal:Honestly, it's an ugly, evil kludge, but it does work. :)
Is also helpful. My parent views were consuming my gesture recognizer
Coupled with
it is great! and you don't even need to add your own pan gesture recognizer
A better alternative would be to set the delegate of your own gesture recogniser and then add the delegate method as follows :
It will then work as before.
Hey there is a delegate method in the Google maps.