7

有没有办法在这个谷歌地图服务组件中检测缩放(捏和双击)?

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture

无论做出何种动作,上述方法都会触发。

4

4 回答 4

9

还有另一种方法可以检测缩放(或任何其他属性)是否已更改 - 键值观察(又名 KVO)。当没有提供委托方法供我们使用时,它特别有用。来自苹果文档

键值观察提供了一种机制,允许对象在其他对象的特定属性发生更改时得到通知。

无论您在何处设置地图视图,都添加以下代码段:

[self.mapView addObserver:self forKeyPath:@"camera.zoom" options:0 context:nil];

现在您只需要实现-observeValueForKeyPath:ofObject:change:context:实际接收回调的方法。像这样:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

if ([keyPath isEqualToString:@"camera.zoom"]) {

    // this static variable will hold the last value between invocations.
    static CGFloat lastZoom = 0;

    GMSMapView *mapView = (GMSMapView *)object;
    CGFloat currentZoom = [[mapView camera] zoom];

    if (!(fabs((lastZoom) - (currentZoom)) < FLT_EPSILON)) {

        //Zoom level has actually changed!
        NSLog(@"Zoom changed to: %.2f", [[mapView camera] zoom]);

    }

    //update last zoom level value.
    lastZoom = currentZoom;

    }
}

不要忘记删除观察者-dealloc-viewDidDissapear根据您的需要:

- (void)dealloc {

    [self.mapView removeObserver:self forKeyPath:@"camera.zoom"];

}

快乐编码:-)

于 2015-05-26T11:43:33.273 回答
4

我希望你GMSMapViewDelegate在头文件中使用过

GMSMapView在作为对象委托的实现文件中使用以下代码

-(void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition*)position {
   float zoom = mapView.camera.zoom;
   // handle you zoom related logic
}
于 2014-04-23T15:29:57.503 回答
4

Swift 3
以下代码对我有用:

func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
    print("Pinched or tapped on the map")
}

当用户在屏幕上缩放(双击或捏合)时,此方法被调用一次。

于 2017-09-18T13:13:05.320 回答
1

一些旧的,但仍然......你可以这样检测,首先说mapView在视图中使用手势:

    mapView.settings.consumesGesturesInView = true

    for gestureRecognizer in mapView.gestureRecognizers! {
        gestureRecognizer.addTarget(self, action: "handleMapGesture:")
    }

其次,在您的功能上,检查两件事,状态和触摸次数。

如果状态为.Changed,则手势开始,2 次触摸是缩放捏合。

最难的是双击,你必须实现某种迟到的监听器并链接最后两个手势,识别“点击”的方法是只需.Begin和一次触摸,这种手势.End没有状态。.Changed

注意:这适用于 Swift 2,未在 3 或 4 上测试

于 2016-03-14T08:20:55.000 回答