在MKMapView上移动/更新MKOverlay

时间:2010-07-22 09:12:40

标签: iphone mkmapview mkannotation

有没有办法更新(即移动)已添加到MKOverlay的{​​{1}}。删除一个旧的并添加一个旧的很糟糕(慢)。

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

MKMapView

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 我觉得它有点好,但我不能使用MKAnnotionsMKPolyline等等,整个信息都减少到一个点了。

6 个答案:

答案 0 :(得分:4)

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 - 我认为这会导致叠加整个地图重新加载(一旦可见)。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这似乎迫使地图刷新叠加层。也可能是注释。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

旁注,我不禁觉得这不是必须的,并且有一个更合适的解决方案,但是,我没有找到它。即使将add命令调度到主队列,在我移动地图之前,可重现的覆盖层仍可再现。

答案 5 :(得分:0)

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