【发布时间】:2016-01-29 01:49:58
【问题描述】:
我如何检测用户何时拖动或移动了 MKMapView,以防止自动归位到用户的当前位置。
【问题讨论】:
标签: ios swift mkmapview swift2
我如何检测用户何时拖动或移动了 MKMapView,以防止自动归位到用户的当前位置。
【问题讨论】:
标签: ios swift mkmapview swift2
注意:这个答案是可能的,并且改编自 Jano 对 Objective-C 相同问题的回答:determine if MKMapView was dragged/moved。谢谢Jano。
要正确检测地图拖动,您必须添加 UIPanGestureRecognizer。这是拖动手势识别器(平移 = 拖动)。
第 1 步: 在 viewDidLoad (Swift 2) 中添加手势识别器
override func viewDidLoad() {
super.viewDidLoad()
// All your other setup code
let mapDragRecognizer = UIPanGestureRecognizer(target: self, action: "didDragMap:")
mapDragRecognizer.delegate = self
self.mapView.addGestureRecognizer(mapDragRecognizer)
}
上述手势识别器设置的 Swift 3 版本(选择器语法已更改)
override func viewDidLoad() {
super.viewDidLoad()
let mapDragRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.didDragMap(gestureRecognizer:)))
mapDragRecognizer.delegate = self
self.mapView.addGestureRecognizer(mapDragRecognizer)
}
第 2 步:将协议 UIGestureRecognizerDelegate 添加到视图控制器,使其作为委托工作。
class MapViewController: UIViewController, UIGestureRecognizerDelegate
第 3 步:为 UIPanGestureRecognizer 添加以下代码,以使用 MKMapView 中现有的手势识别器:
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
第 4 步:如果您想每次拖动调用一次方法而不是 50 次,请在选择器中检测“拖动结束”或“拖动开始”状态:
func didDragMap(gestureRecognizer: UIGestureRecognizer) {
if (gestureRecognizer.state == UIGestureRecognizerState.Began) {
print("Map drag began")
}
if (gestureRecognizer.state == UIGestureRecognizerState.Ended) {
print("Map drag ended")
}
}
希望对有需要的人有所帮助!
【讨论】:
didDragMap() 由 mapDragRecognizer 的选择器触发。它可能不会被你调用,因为它的语法在 swift 中不断变化 - 例如,在 swift 3 中,手势识别器需要像这样设置才能触发 didDragMap 函数。 let mapPanInteractionRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.didDragMap(gestureRecognizer:))).