【问题标题】:moving/updating MKOverlay on MKMapView在 MKMapView 上移动/更新 MKOverlay
【发布时间】:2010-07-22 09:12:40
【问题描述】:

有没有办法更新(即移动)已经添加到MKMapViewMKOverlay。删除旧的并添加新的很糟糕(慢)。

即我想触发在屏幕上移动叠加层时调用此函数的后台函数:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay

(我认为MKAnnotions 会好一点,但我不能使用MKPolylineMKPolygon 等,并且整个信息被简化为一个点)

【问题讨论】:

  • 补充:给你一个我需要这个功能的印象:我使用 MapView 并在它上面放置 Annotations 来显示卫星的位置。每颗卫星还应显示一个足迹(您可以在地平线上方“看到”卫星的区域)。该信息(足迹的位置和形状)必须定期更新。此刻,我有一个解决方案,其中包含一个视图或所有足迹,我用 CoreGraphics 绘制正确的形状。但我更喜欢 MKOverlay 的解决方案,但我无法让它们动态化......有什么想法吗?

标签: iphone mkmapview mkannotation


【解决方案1】:

MKOverlayView 有以下方法强制 MapKit 重新渲染给定的 mapRect:

- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect

- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale

如果您使用计时器(或定期 HTTP 请求或其他某种方法来确定应更新叠加层),则在 overlayView 上调用上述方法之一将导致它重新渲染该点地图(即-canDrawMapRect:zoomScale:将被再次调用,如果前者返回YES,则-drawMapRect:zoomScale:inContext:将被调用)。


更新:

如果您不确定需要重新渲染哪个 mapRect,您可能可以使用 MKMapRectWorld 常量作为 mapRect — 我相信这会导致整个地图重新加载(一旦可见)。

【讨论】:

  • 在我看来……从 iOS 7 开始,这些方法在 MKOverlayRenderer,而不是 MKOverlayView
  • 如果你想更新整个地图,你可以拨打setNeedsDisplay
【解决方案2】:

使用MKAnnotations。您可以更改它们的坐标。只需禁用任何与触摸相关的东西。您需要自己的绘图代码来绘制注释,OpenGL 可能会做到这一点。没有人会知道其中的区别。

【讨论】:

  • AnnotationViews 在缩放时保持相同的大小,叠加大小与缩放比例有关,对吧?我需要在地图上指定一个圆圈来标记特定区域(可能是公园或其他地方)。
【解决方案3】:

这似乎会强制地图刷新叠加层。可能还有注释。

[self.mapView setCenterCoordinate:self.mapView.centerCoordinate];

【讨论】:

  • 这是否动画/移动覆盖?
【解决方案4】:

实际上我不得不强制覆盖视图使路径无效,在设置新路径之前清除旧路径。 [多边形视图无效路径]。告诉地图视图需要刷新显示对我来说是不够的。

【讨论】:

    【解决方案5】:

    Swift 3+ 更新,这对我有用,感谢@zenchemical 的启发。

                DispatchQueue.main.async {
                    self.map.add(overlay, level: .aboveRoads)
                    self.map.setCenter(self.map.centerCoordinate, animated: false)
                }
    

    旁注,我不禁觉得这不应该是必要的,并且有一个更合适的解决方案,但是,我还没有找到它。即使添加命令被分派到主队列,在我移动地图之前,叠加层也不会再现。

    【讨论】:

      【解决方案6】:

      原始setNeedsDisplay 存在问题,如果多边形的边界矩形发生变化,那么 MKMapView 将无法正确更新整个矩形,其次,MKPolygon/MKPolygonRenderer 的多边形不可更新,以及添加/删除管道的问题如果更新 MapView 的请求太多,它可能会在管道中变慢,如果多边形中有更新,我目前使用 30Hz 线程循环我添加/删除

      【讨论】:

        猜你喜欢
        • 2019-03-22
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多