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

时间:2013-07-02 00:43:09

标签: ios cocoa google-maps-sdk-ios xcode-storyboard

通过手势识别器在GMSMapView上捕捉拖/平移手势我遇到了一个奇怪的问题。此问题仅在从GMS 1.2更新到1.3.1之后浮出水面,其中(引用documentation),

  

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

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

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

6 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:9)

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



    }


}

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

答案 2 :(得分:3)

As it turns out,一个GMSMapView实例现在拥有一个GMSBlockingGestureRecognizer,它吞噬了所有手势。所以有两种选择:

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

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

viewDidLoad

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

通过对Google api和其他方法的分析,我没有找到合适的方法。对于这个问题,最好的答案是使用平移手势。

将平移手势添加为mapView

self.mapView.settings.consumesGesturesInView = false
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self. panHandler(_:)))
self.mapView.addGestureRecognizer(panGesture)

平移手势方法的实现

@objc private func panHandler(_ pan : UIPanGestureRecognizer){

        if pan.state == .ended{
            let mapSize = self.mapView.frame.size
            let point = CGPoint(x: mapSize.width/2, y: mapSize.height/2)
            let newCoordinate = self.mapView.projection.coordinate(for: point)
            print(newCoordinate)
             //do task here
        }
}