setRegion:MKMapView变得无法响应

时间:2017-02-10 13:31:58

标签: ios swift

我有MKMapView,上面有2个按钮:放大和缩小。

我注意到,当我使用它们时,我无法再缩放地图以进行缩放,直到动画完成。

我的按钮在比现在更小或更大的范围内连接到setRegion

我尝试在地图中添加UIPinchGestureRecognizer以停止动画并允许捏合工作。我是这样做的:

我添加了一个Bool变量,用于确定地图当前是否通过按下按钮来设置动画。

func pinchRecognized() {
    if animating {
        var region = self.region
        region.span.latitudeDelta += 0.001
        setRegion(region, animated: false)
        animating = false
    }
}

我像这样重写setRegion:

override func setRegion(_ region: MKCoordinateRegion, animated: Bool) {
    if (animated)
    {
        animating = true
        super.setRegion(region, animated: animated)

        perform(#selector(noLongerAnimating), with: nil, afterDelay: 1)
    }
    else
    {
        super.setRegion(region, animated: animated)
    }
}

func noLongerAnimating() {
    animating = false
}

这些可以停止动画,但是地图本身无法识别缩放,即使我这样做了:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

我想setRegion中的pinchRecognized打破了它,但我不知道如何停止动画。

按要求,按钮代码,两个按钮都使用此方法,放大使用0.5,缩小使用2:

func zoomTo(delta: Double, animated: Bool) {
    var region = self.region
    var span = region.span

    span.latitudeDelta *= delta
    span.longitudeDelta *= delta
    if (span.latitudeDelta < 180 && span.longitudeDelta < 180)
    {
        region.span = span
        setRegion(region, animated: animated)
    }
}

编辑:我尝试在setRegion中设置gestureRecognizer:shouldRecognizeSimultaneouslyWith:(停止动画的那个),但在动画地图时不会调用它

编辑:在尝试了@robinb建议之后,我看到我的注释比我的地图本身更新,表明该区域已设置,它只是等待某些东西可以直观地更新地图。 / p>

2 个答案:

答案 0 :(得分:2)

手势识别器不会触发正在制作动画的视图。在ViewController中保存变量/数组中的视图。使用此帖子中的代码执行动画:https://stackoverflow.com/a/13814789/3970581

以下是测试项目:https://github.com/DuncanMC/iOS-CAAnimation-group-demo

答案 1 :(得分:1)

MapView动画在启动时将isUserInteractionEnabled设置为false,但是如果你想强制它,你可以继承MKMapView并覆盖UIView的touchesBegan方法来响应用户交互。在那里,您可以先调用setCenter / setRegion(开始值或目标值)而不用动画来中断/退出正在进行的动画,并将isUserInteractionEnabled设置为true。

MKMapView使用CATiledLayer,遗憾的是,在中断时没有简单的方法来获取地图的区域和/或中心。 另一方面,我注意到动画持续时间虽然是私有的,但是当调用touchesBegun时你可以使用Timer来更好地猜测地图的区域

private var isAnimating: Bool = false

override func setRegion(_ region: MKCoordinateRegion, animated: Bool) {
   isAnimating = animated
   ...
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if isAnimating {
       isAnimating = false
       let region = // Destination region or the approximate region where the animation reached at this moment (although this is a nightmare todo)
       setRegion(region: region, animated: false) // or use setCenter
       isUserInteractionEnabled = true 
    }
}