拦截GMSMapView上UIView的触摸事件

4
我试图在Google GMSMapView上覆盖一个UIView。目的是为了拦截滑动事件,以便知道何时手动移动地图。(我知道我可以检查-mapView:willMove: 但无论地图是由程序或手动触摸移动,该方法都会被调用)。我正在根据位置更新重新设置地图的中心点-因为谷歌不像苹果那样自动为您完成。和所有的地图程序一样,我想在用户手动移动地图后立即停止聚焦在当前位置。我能想到的捕捉这种情况的唯一方法(除了切换到MapKit或等待Google添加API)就是在视图经过设置在地图上的另一个视图时捕获滑动事件。
为了澄清,我的问题是如何将一个视图放在Google地图上,并使其响应滑动,并仍然允许此事件通过GMSMapView传递。
我的地图和interceptView都是主视图的同级子节点。interceptView有一个手势识别器,设置为不透明、不隐藏且userInteractionEnabled = YES。因此,interceptView可以很好地接收触摸事件。但底下的地图不会移动。如果我设置interceptView.userInteractionEnabled = NO, 地图就正常工作了。
通过重写touchesBegan并调用GMSMapView的touchesBegan来“传递触摸”不起作用。而重写hitTest似乎不是一个选项,因为我无法子类化GMSMapView。有人做过这个吗?我知道这里有很多关于传递特定事件的内容。我想在两个视图上处理一个特定事件,其中一个是我不能修改代码的Google地图层。
3个回答

4

mapView:willMove:方法接收一个布尔值参数"gesture",如果移动是由用户手势触发的,则为true,否则为false。因此,只有当"gesture"为true时,您才可以停止重新居中地图。这样,您就可以确定地图正在手动移动。


这种方法存在一个问题:如果用户只是进行了捏合手势,它也会触发。这样的手势不应该停止将地图居中在用户的位置上。我已经为这个问题创建了一个新的线程:https://stackoverflow.com/questions/71752224/replicate-the-follow-my-location-mode-of-the-google-maps-app-in-a-gmsmapview - user1195883

1
这是一个委托方法,请检查它。
- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate;

我使用这个来拦截地图视图中的点击并关闭视图控制器。它运行良好。请确保实现GMSMapViewDelegate并执行mapView.delegate = self; 谢谢。 - Laurent

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

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