首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >setRegion: MKMapView变得无响应

setRegion: MKMapView变得无响应
EN

Stack Overflow用户
提问于 2017-02-10 21:31:58
回答 2查看 752关注 0票数 18

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

我注意到,当我使用它们时,在动画完成之前,我不能再挤压地图进行缩放。

我的按钮连接到setRegion上的跨度比现在更小或更大。

我尝试添加一个UIPinchGestureRecognizer到我的地图,以停止动画,并允许收缩工作。下面是我是如何做到的:

我添加了一个Bool变量,用于保存点击按钮后地图当前是否处于动画状态。

代码语言:javascript
复制
func pinchRecognized() {
    if animating {
        var region = self.region
        region.span.latitudeDelta += 0.001
        setRegion(region, animated: false)
        animating = false
    }
}

我像这样覆盖setRegion:

代码语言:javascript
复制
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
}

它们用于停止动画,但地图本身无法识别缩放,即使我这样做:

代码语言:javascript
复制
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

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

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

代码语言:javascript
复制
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)
    }
}

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

编辑:在尝试了@robinb的建议后,我发现我的注释更新速度比地图本身更快,这表明区域已经设置好了,它只是在等待可视化更新地图的东西。

EN

回答 2

Stack Overflow用户

发布于 2017-02-13 18:02:15

手势识别器不会在动画视图上触发。将视图保存在ViewController的变量/数组中。使用本文中的代码执行动画:https://stackoverflow.com/a/13814789/3970581

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

票数 2
EN

Stack Overflow用户

发布于 2017-02-20 06:27:09

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

MKMapView使用CATiledLayer,不幸的是,在中断时没有简单的方法来获取地图的区域和/或中心。另一方面,我注意到动画持续时间是恒定的,尽管是私有的,因此当调用touchesBegun时,您可以使用计时器更好地猜测地图的区域

代码语言:javascript
复制
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 
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42160625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档