点击MKAnnotation以“选择”它真的很慢

时间:2016-02-25 22:10:15

标签: ios swift mapkit

点击和MKMapView上的注释显示标注之间几乎有0.5秒的延迟。

有谁知道为什么会出现这种情况,以及当用户点击地图时我如何能够立即响应?

即使用户位置注释在点击时在标注中显示“当前位置”,也会发生这种情况。我希望它在点击时立即显示,没有奇怪的延迟。

编辑:我认为这是由于didSelectAnnotationView调用的setSelected函数。 setSelected有一个'动画'属性,可能会减慢它。如何消除该动画?

2 个答案:

答案 0 :(得分:4)

经过大量研究,我找到了解决方案!这是一个小小的hacky,但是它就像一个魅力。

秘密在于,当关闭地图缩放时,didSelect侦听器会立即触发。因为我们需要缩放(当然),所以我们需要做的是暂时禁用缩放,仅在didSelect事件发生的时候!

在Swift中:

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
gestureRecognizer.numberOfTapsRequired = 1
gestureRecognizer.numberOfTouchesRequired = 1
gestureRecognizer.delegate = self
mapView.addGestureRecognizer(gestureRecognizer)

@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
    // disabling zoom, so the didSelect triggers immediately
    mapView.isZoomEnabled = false
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        self.mapView.isZoomEnabled = true
    }
}

此手势事件在didSelect事件之前触发。因此,在调用didSelect事件的那一刻,缩放功能已关闭,并且确实触发而没有延迟!

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    mapView.isZoomEnabled = true // Not really necessary
    // Triggered immediately, do something
}

注意:这将禁用地图的doubleTap手势,但我想它们使用的次数不多。因此,如果您想快速响应,就需要忍受它!

答案 1 :(得分:3)

不幸的是,你无能为力。这与在Mobile Safari中点击链接的速度相同的原因完全相同:手势识别器必须争吵一段时间才能决定您是否可以在他们同意您正在点击之前进行滚动(拖动)。

所以,它与动画无关。在这种情况下,这只是手势识别的本质。