更新到SDK 1.3.1后,GMSMapView上的拖动/平移手势未被捕获

我通过手势识别器在GMSMapView上捕获拖动/平移手势时遇到了一个奇怪的问题。 只有在从GMS 1.2更新到1.3.1之后才会出现此问题,其中(引用文档 ),

GMSMapView更加积极地消耗了触摸

我有一个UIViewController在其主视图下持有GMSMapView。 我发现GMSMapDelegate不提供处理拖动/平移手势的方法,因此我向UIViewController添加了一个UIPanGestureRecognizer,将其链接到IBAction选择器,并设置引用sockets和sockets集合,如下面链接的屏幕截图: http:// i .stack.imgur.com / gktoa.png

因此任何拖动动作都只会触发recognizeDragOnMap:选择器,如下所示:

 -(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"); } } 

此设置过去在GMS 1.2.0下完美运行。 更新后,GMSMapView会像过去那样响应手势,但上面的方法永远不会被调用!

任何人都知道该怎么做和/或如何解决它?

对于1.4或更高版本,您只需在GMSUISettings对象中设置consumemesGesturesInView consumesGesturesInView = NO

如果你这样做,请注意当你只想与地图交互时,你将不得不处理可能让你的超级视图做事情的事件…我的意思是,例如,拖动添加到一个GMSMapView的东西滚动视图将滚动滚动滚动视图!

 mapView.settings.consumesGesturesInView = YES; 

也有帮助。 我的父视图使用了我的手势识别器

再加上

 for (UIGestureRecognizer *gestureRecognizer in mapView.gestureRecognizers) { [gestureRecognizer addTarget:self action:@selector(handlePan:)]; } ////// -(IBAction) handlePan:(UIPanGestureRecognizer*)sender { if (sender.state == UIGestureRecognizerStateEnded) { CGSize size = mapView.frame.size; CGPoint tp = CGPointMake(size.width/2, size.height/2); CLLocationCoordinate2D loc = [mapView.projection coordinateForPoint:tp]; [mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:loc zoom:mapView.camera.zoom]]; } } 

太好了! 而且你甚至不需要添加自己的平移手势识别器

事实certificate , GMSMapView实例现在拥有一个GMSBlockingGestureRecognizer ,可以GMSBlockingGestureRecognizer所有手势。 所以有两种选择:

  • 加载GMSMapView后可能会删除此识别器(可能会破坏依赖它的内部function)( 如下所示 ); 要么
  • 将我自己的目标/动作附加到识别器。

继续第二种方法, UIViewControllerviewDidLoad的以下代码使事情恢复正常:

 self.mapView = (RAMapView *)[self.view viewWithTag:1]; for (UIGestureRecognizer *gestureRecognizer in self.mapView.gestureRecognizers) { [gestureRecognizer addTarget:self action:@selector(recognizeDragOnMap:)]; } 

老实说,这是一个丑陋,邪恶的kludge,但它确实有效。 🙂

更好的选择是设置自己的手势识别器的委托,然后添加委托方法,如下所示:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } 

然后它将像以前一样工作。

嘿,Google地图中有一个委托方法。

 - (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate;