在MKMapview执行SetRegion动画函数调用时禁用触摸事件

时间:2015-05-17 00:02:11

标签: ios swift animation mkmapview

我已经有这个问题好几个月了,我现在正在寻求帮助。我尝试了很多东西。我的问题是,在我的iOS 8 Swift应用程序中,我使用的是地图注释聚类,工作正常,当用户点击地图上的聚簇图钉时,mapView会放大到该区域的中心,将注释视图解聚为使用函数mapView.setRegion(region: myRegion, animated: true)的各个视图(取决于注释的数量)。这很好用,关于它的一切都很可爱。

我的问题(我偶然发现)是当我调用setRegion函数时,地图开始放大动画,如果我尝试在动画时滚动到地图上的其他位置仍在发生我在控制台中使用以下输出崩溃:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用   无法识别的选择器发送到实例0x126d0a890'

因此,考虑到这一点,当我在false中将动画标记设置为setRegion()时,不会发生此崩溃。但我想做的是在视图动画时禁用触摸事件,我认为在setRegion被调用时会自动发生,并且默认情况下将userInteractionEnabled设置为false。

我试过这段代码但没有成功

var center = view.annotation.coordinate
var span = MKCoordinateSpanMake(mapView.region.span.latitudeDelta/5.0, mapView.region.span.longitudeDelta/5.0)

mapView.userInteractionEnabled = false
mapView.scrollEnabled = false
mapView.rotateEnabled = false
mapView.setRegion(MKCoordinateRegionMake(center, span), animated: true)
mapView.userInteractionEnabled = true
mapView.scrollEnabled = true
mapView.rotateEnabled = true

我不知道该怎么办,因为我想保留动画。 任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

setRegion 启动动画更新,该动画更新无法完成,并且很可能在您的代码中执行setRegion行后甚至无法启动。它是异步发生的。

这意味着禁用和重新启用用户互动无效。

在您的控制器中,您需要处理以下MKMapViewDelegate回调:

mapView(_:regionWillChangeAnimated:)

mapView(_:regionDidChangeAnimated:)

在动画开始前禁用用户交互和/或地图更新,并在完成后启用。