【问题标题】:Tapping an MKAnnotation to "select" it is REALLY slow点击 MKAnnotation 来“选择”它真的很慢
【发布时间】:2016-02-25 22:10:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios swift mapkit


    【解决方案1】:

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

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

    在斯威夫特中:

    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
    }
    

    注意:这会禁用地图的双击手势,但我想它们并没有被太多使用。因此,如果您想要快速响应,您需要忍受它!

    【讨论】:

    • 天啊!这真太了不起了!我打算用我自己的手势识别器重新实现注释选择,这将涉及处理相当多的边缘情况。这为我节省了大量时间。谢谢!
    【解决方案2】:

    很遗憾,您对此无能为力。这与在 Mobile Safari 中点击链接很慢的原因完全相同:手势识别器必须在他们同意您点击之前确定您是否可以滚动(拖动)。

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

    【讨论】:

    • 如果我移除滚动/拖动/其他手势怎么办?
    • 或者如果我在每个 annotationView 顶部添加一个按钮并使用它来指示它是否被选中,该怎么办?因为按钮不存在碰撞问题。
    • 如果您正在考虑移除滚动手势,那么为什么不关闭scrollEnabledzoomEnabled
    • 需要地图来滚动和缩放......但我明白你的意思 - MapView 正在检测触摸,然后检查它是否是滚动,然后是拖动,然后是点击。有没有办法告诉 MapView “让注释先检查,然后检查你是否被感动”?
    • 它总是会发生,我用香草 MapView 尝试过。见鬼,在 FindMyFriends 中尝试并点击您的位置——这与我试图消除的“延迟”数量完全相同。然而,这不是标注——即使使用 canShowCallout = false 它仍然是相同的延迟。
    【解决方案3】:

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

    原生缩放 MKOneHandedZoomGestureRecognizer、MKZoomingPanGestureRecognizer 和 MKConditionalPanZoomGestureRecognizer 可以工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 2010-12-28
      相关资源
      最近更新 更多