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

ARM*_*TAV 7 mapkit ios swift

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

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

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

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

mat*_*att 8

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

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


小智 8

经过大量研究,我找到了解决方案!它有一点点hacky,但它的作用就像一个魅力。

秘诀是,当关闭地图缩放时, didSelect 侦听器会立即触发。由于我们需要缩放(当然),我们需要做的是暂时禁用缩放,仅在 didSelect 事件发生的那一刻!

在斯威夫特:

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

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

此手势事件在 didSelect 事件之前触发。所以当 didSelect 事件被调用时,缩放被关闭并且它不会延迟触发!

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

注意:这会禁用地图的 doubleTap 手势,但我想它们不会被使用太多。因此,如果您想要快速响应,则需要接受它!