将 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 将起作用。
而且点击时的即时反应也将由注释视图上的按钮或点击识别器处理。
在点击和显示 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 将起作用。
而且点击时的即时反应也将由注释视图上的按钮或点击识别器处理。