将 MKAnnotation 轻敲到 "select" 它真的很慢

Tapping an MKAnnotation to "select" it is REALLY slow

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

有谁知道为什么会这样,以及我如何让它在用户点击地图时立即响应?

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

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

很遗憾,您对此无能为力。这与在 Mobile Safari 中点击链接速度缓慢的原因完全相同:手势识别器必须争先恐后地决定您是否正在滚动(拖动),然后他们才会同意您正在点击。

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

经过大量研究,我找到了解决方案!虽然有点小黑,但效果很好。

秘诀在于,当关闭地图缩放时,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
}

注意:这会禁用地图的双击手势,但我想它们用得不多。所以如果你想要一个快速的反应,你需要忍受它!

我的解决方案是启用地图缩放并在 MKAnnotationView 子类上添加单独的点击处理程序。

原生缩放 MKOneHandedZoomGestureRecognizer、MKZoomingPanGestureRecognizer 和 MKConditionalPanZoomGestureRecognizer 将起作用。

而且点击时的即时反应也将由注释视图上的按钮或点击识别器处理。