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

Raf*_*ann 5 cocoa ios xcode-storyboard google-maps-sdk-ios

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

GMSMapView可以更好地消耗触摸

我有一个UIViewController在其主视图下持有GMSMapView.我发现GMSMapDelegate不提供处理拖动/平移手势的方法,因此我将UIPanGestureRecognizer添加到UIViewController,将其链接到IBAction选择器,并设置引用插座和插座集合,如下面链接的屏幕截图: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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

任何人都知道是什么和/或如何解决它?

Aur*_*rte 12

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

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


sta*_*lew 9

mapView.settings.consumesGesturesInView = YES;
Run Code Online (Sandbox Code Playgroud)

也有帮助.我的父视图正在消耗我的手势识别器

再加上

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]];



    }


}
Run Code Online (Sandbox Code Playgroud)

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


Raf*_*ann 3

事实证明,一个GMSMapView实例现在拥有一个GMSBlockingGestureRecognizer吞噬所有手势的实例。所以有两个选择:

  • 加载后删除此识别器GMSMapView(可能会破坏依赖于它的内部功能)(像这样);或者
  • 将我自己的目标/动作附加到识别器。

采用第二种方法, 中的以下代码UIViewController使viewDidLoad事情恢复正常:

self.mapView = (RAMapView *)[self.view viewWithTag:1];

for (UIGestureRecognizer *gestureRecognizer in self.mapView.gestureRecognizers) {
    [gestureRecognizer addTarget:self action:@selector(recognizeDragOnMap:)];
}
Run Code Online (Sandbox Code Playgroud)

老实说,这是一种丑陋、邪恶的拼凑,但它确实有效。:)