有没有办法更新(即移动)已添加到MKOverlay
的{{1}}。删除一个旧的并添加一个旧的很糟糕(慢)。
即我想在屏幕上移动叠加层时触发调用此功能的后台功能:
MKMapView
(- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
我觉得它有点好,但我不能使用MKAnnotions
,MKPolyline
等等,整个信息都减少到一个点了。
答案 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线程循环。我确实添加/删除