我有一个MKMapView
,上面有两个按钮:放大和缩小。
我注意到,当我使用它们时,在动画完成之前,我不能再挤压地图进行缩放。
我的按钮连接到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
}
我猜是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)
}
}
编辑:我尝试在gestureRecognizer:shouldRecognizeSimultaneouslyWith:
中设置setRegion
(停止动画的那个),但在动画地图时没有调用它。
编辑:在尝试了@robinb的建议后,我发现我的注释更新速度比地图本身更快,这表明区域已经设置好了,它只是在等待可视化更新地图的东西。
发布于 2017-02-13 18:02:15
手势识别器不会在动画视图上触发。将视图保存在ViewController的变量/数组中。使用本文中的代码执行动画:https://stackoverflow.com/a/13814789/3970581
下面是测试项目:https://github.com/DuncanMC/iOS-CAAnimation-group-demo
发布于 2017-02-20 06:27:09
MapView动画在启动时将isUserInteractionEnabled设置为false,但是如果你想强制这样做,你可以子类MKMapView并覆盖UIView的touchesBegan方法来响应用户交互。在这里,您可以首先调用不带动画的setCenter/setRegion (起始值或目标值)来中断/退出正在进行的动画,并将isUserInteractionEnabled设置为true。
MKMapView使用CATiledLayer,不幸的是,在中断时没有简单的方法来获取地图的区域和/或中心。另一方面,我注意到动画持续时间是恒定的,尽管是私有的,因此当调用touchesBegun时,您可以使用计时器更好地猜测地图的区域
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
}
}
https://stackoverflow.com/questions/42160625
复制相似问题