Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios setRegion:MKMapView变得无响应_Ios_Swift - Fatal编程技术网

Ios setRegion:MKMapView变得无响应

Ios setRegion:MKMapView变得无响应,ios,swift,Ios,Swift,我有一个MKMapView,上面有两个按钮:放大和缩小 我注意到,当我使用它们时,在动画完成之前,我不能再捏贴图进行缩放 我将我的按钮连接到setRegion,其跨度比现在小或大 我尝试将UIPinchGestureRecognitor添加到我的地图中,以停止动画并允许挤压工作。我是这样做的: 我添加了一个Bool变量,该变量通过点击按钮来保持贴图当前是否处于动画状态 func pinchRecognized() { if animating { var region =

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

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

我将我的按钮连接到
setRegion
,其跨度比现在小或大

我尝试将
UIPinchGestureRecognitor
添加到我的地图中,以停止动画并允许挤压工作。我是这样做的:

我添加了一个
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
}
我猜
pinchRecognized
中的
setRegion
会破坏它,但我不知道如何停止动画

根据要求,按钮代码,两个按钮均使用此方法,放大使用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)
    }
}
func zoomTo(delta:Double,动画:Bool){
var区域=自我区域
var span=region.span
span.latitudeDelta*=增量
span.longitudeDelta*=增量
如果(span.latitudeDelta<180和span.longitudeDelta<180)
{
region.span=span
setRegion(区域,已设置动画:已设置动画)
}
}
编辑:我尝试在
手势识别器:shoulldrecognizesimultaneouslywith:
中设置
setRegion
(停止动画的那一个),但在设置地图动画时没有调用它


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

手势识别器不会在正在设置动画的视图上启动。将视图保存在ViewController的变量/数组中。使用本文中的代码执行动画:


下面是测试项目:

MapView动画在启动时将isUserInteractionEnabled设置为false,但是如果要强制设置,可以将MKMapView子类化,并覆盖UIView的touchesBegind方法以响应用户交互。在那里,您可以首先在没有动画的情况下调用setCenter/setRegion(起始值或目标值),以中断/退出正在进行的动画,并将isUserInteractionEnabled设置为true

MKMapView使用CATILDELAYER,不幸的是,在中断时无法轻松获取地图的区域和/或中心。 另一方面,我注意到动画的持续时间是恒定的,尽管是私有的,所以当调用touchesbeated时,可以使用计时器更好地猜测贴图的区域

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 
    }
}
private变量isAnimating:Bool=false
覆盖函数集合区域(u区域:MKCoordinateRegion,动画:Bool){
i动画化=动画化
...
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
如果我生气{
isAnimating=false
let region=//目标区域或动画此时到达的近似区域(尽管这是一个噩梦)
setRegion(region:region,动画:false)//或使用setCenter
isUserInteractionEnabled=true
}
}

我认为这会起作用,但从手势识别器在地图上使用
setRegion
似乎无法更新地图。单步执行代码不会显示任何错误,
setRegion
会使用正确的值进行更新,它只是不会更新区域。你能发布你的按钮方法代码吗?@CodeChanger更新了问题覆盖setRegion的任何特殊原因:function?@aman.sood如果地图正在动画,则设置变量,这在动画开始之前设置,并在动画开始后延迟1秒。我这样做是为了知道视图是否正在我的pinchrecognized中设置动画,以便我可以取消动画。好的。总而言之,您需要缩放和收缩才能毫不延迟地工作?如果是,让我为您找到一个解决方案。这会给出相同的结果,贴图使用setRegion(),这打破了您刚刚开始的当前限制。