拦截通过GMSMapView触摸UIView

时间:2013-08-07 02:23:08

标签: ios uiview uigesturerecognizer gmsmapview

我正在尝试在Google GMSMapView上叠加UIView。目标是拦截滑动以便知道何时手动移动地图。 (我知道我可以检查-mapView:willMove:但无论地图是以编程方式移动还是由于手动触摸,都会调用它。我正在以编程方式重新定位地图作为位置更新 - 因为谷歌没有像苹果那样为你做这件事。就像每个地图程序一样,我想在用户手动移动地图时立即停止当前位置。我可以想到捕捉这种情况的唯一方法(没有切换到mapkit或等待谷歌添加到API)是捕获滑动,因为它正越过地图上的视图。

为了澄清,我的问题是如何在谷歌地图上放置视图,让它响应滑动并仍然允许该事件传递到GMSMapView?

我的map和interceptView都是主视图的兄弟孩子。 interceptView有一个gestureRecognizer,设置为opaque,not hidden和userInteractionEnabled = YES。因此,interceptView可以很好地接收触摸事件。但是下面的地图不会移动。如果我设置interceptView.userInteractionEnabled = NO,地图就可以正常工作。

通过覆盖touchesBegan“传递触摸”并调用GMSMapView的touchesBegan没有做任何事情。并且重写hitTest似乎不是一个选项,因为我无法继承GMSMapView。有没有人这样做过?我知道这里有很多关于传递特定事件的内容。我想在两个视图上处理特定事件,其中一个是Google的地图图层,我无法修改其代码。

3 个答案:

答案 0 :(得分:4)

mapView:willMove:接收一个bool“手势”,如果移动是由用户手势触发的,则为true,如果不是,则为false。因此,只有“手势”为真,您才能停止重新定位地图。这样您可以确保手动移动地图。

答案 1 :(得分:1)

这是委托方法检查

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

答案 2 :(得分:0)

您可以使用GMSMapViewDelegete拦截水龙头并实施此方法:

-(void)panoramaView:(GMSPanoramaView *)panoramaView didTap:(CGPoint)point;

示例:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    CLLocationCoordinate2D panoramaNear = {latitudine,longitudine};
    GMSPanoramaView *panoView = [GMSPanoramaView panoramaWithFrame:CGRectZero
                                    nearCoordinate:panoramaNear];
    [panoView setDelegate:self];
    self.view = panoView;
}
-(void)panoramaView:(GMSPanoramaView *)panoramaView didTap:(CGPoint)point{
NSLog(@"Tap");
}