检测GMSMapView缩放级别

7
在这个Google地图服务组件中,有没有一种方法可以检测缩放(捏和双击)?
- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture

无论进行何种移动,上述方法都会触发。
4个回答

9
另一种检测缩放(或其他属性)是否已更改的方法是键值观察(Key-Value-Observing,简称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"];

}

愉快的编码 :-)


4

Swift 3
下面的代码对我有效:

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

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

当相机进行任何操作时,而不仅仅是缩放/捏合,都会触发此方法。因此,即使是平移手势、通过编程重置相机等也会触发它。 - Byron Coetsee

4

我希望您已经在头文件中使用了GMSMapViewDelegate

在实现文件中使用以下代码,该代码是GMSMapView对象的代理:

-(void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition*)position {
   float zoom = mapView.camera.zoom;
   // handle you zoom related logic
}

1

一些旧的但仍然有用的方法...您可以通过以下方式检测:首先告诉mapView在视图中消耗手势:

    mapView.settings.consumesGesturesInView = true

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

第二,关于你的函数,检查两件事情,状态和触摸数量。
如果状态是“Changed”,手势开始,并且使用2个触摸是缩放捏合手势。
最难的是双击,您必须实现某种延迟监听器并链接最后两个手势,“Tap”的识别方式仅使用“Begin”和“End”以及一个触摸,这种手势没有“Changed”状态。
注意:此代码适用于Swift 2,未在3或4上测试。

这有些过头了,只是说说而已。 - OhadM
@OhadM 嗯,分享知识是个好主意,对吧?除非我提出的使用方法有一些技术上的问题,否则你的评论就没有意义。如果是这种情况,请分享你的知识。 - Juvs
你的复杂度是 O(n),而其他更简单的方案则不是。这并不意味着它不能工作... - OhadM
实际上,这非常有用。当您禁用平移并保留缩放(设置地理围栏半径)时,它似乎会杀死一堆委托函数,否则这些函数将检测到此操作。通过一些条件检查,这节省了我的一天。顺便说一下,只有一个手势识别器,所以无需迭代。.first就足够了。 - mylogon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接