Google MapView控件不会“吞下”手势,导致包含scrollview消耗它们

时间:2013-04-30 09:36:21

标签: ios xamarin.ios google-maps-sdk-ios

我在嵌入UISCrollView控件的视图中有一个Google MapView控件(使用Xamarin.iOS单声道绑定的Google Maps iOS SDK)。

问题是控件没有“吞下”滑动手势。因此,当用户在地图上滑动时,滑动也由包含滚动视图处理。这是一个真正的“显示停止”并使MapView控件无法使用。

我尝试从MapView派生一个类并重写方法GestureRecognizerShouldBegin和TouchesBegan,但它们永远不会被调用。

这似乎是一个与GMSMapView控件本身有关的问题,而不是与Xamarin绑定有关: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5311

如何阻止UISCrollView接收/处理在MapView控件上进行的手势?

4 个答案:

答案 0 :(得分:1)

使用当前(1.3.0)版本的Google Maps SDK,您可以访问以下设置:

self.mapView.settings.scrollGestures = NO;
self.mapView.settings.zoomGestures = NO;
self.mapView.settings.tiltGestures = NO;

答案 1 :(得分:0)

您可能会发现如何避免事件传播here

希望这有帮助

亚历

答案 2 :(得分:0)

您可以通过编写UIGestureRecognizer子类来解决这个问题,该子类可以处理任何连续手势的触摸,然后通过其gestureRecognizers属性将该识别器添加到GMSMapView。

Google不在其SDK中使用手势识别器,所以现在这不会干扰地图,尽管未来的更新可能会改变这一点。我不知道如何在MonoTouch中定义自定义识别器,但似乎有可能(http://docs.xamarin.com/samples/Touch)。

这个手势识别器需要实现类似这些触摸处理方法的东西:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.state = UIGestureRecognizerStateBegan;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.state = UIGestureRecognizerStateChanged;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.state = UIGestureRecognizerStateEnded;
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.state = UIGestureRecognizerStateCancelled;
}

这将导致地图吃掉它上面的任何触摸,比如MKMapKit,在层次结构中进一步停止任何滚动视图。我担心我不知道C#/ Xamarin.iOS等效代码,希望这很有用。

答案 3 :(得分:0)

对于该帖子的未来读者的参考,在解决的问题部分的以下两个改进是针对ios的谷歌地图sdk的进一步发布:

1,版本1.3.0 - 2013年5月:GMSMapView使用触摸,允许在滚动视图等对象中使用

2,版本1.3.1 - 2013年6月:GMSMapView

更加积极地消耗了触摸