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(),这打破了您刚刚开始的当前限制。