有没有办法更新(即移动)MKOverlay
已经添加到MKMapView
. 删除一个旧的并添加一个新的是可怕的(慢)。
即我想在屏幕上移动覆盖时触发调用此函数的后台函数:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
(MKAnnotions
我认为它好一点,但我不能使用MKPolyline
,MKPolygon
等,并且整个信息被简化为一个点)
有没有办法更新(即移动)MKOverlay
已经添加到MKMapView
. 删除一个旧的并添加一个新的是可怕的(慢)。
即我想在屏幕上移动覆盖时触发调用此函数的后台函数:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
(MKAnnotions
我认为它好一点,但我不能使用MKPolyline
,MKPolygon
等,并且整个信息被简化为一个点)
MKOverlayView
有以下方法强制 MapKit 重新渲染给定的 mapRect:
- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect
- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale
如果您正在使用计时器(或定期 HTTP 请求或某种其他方法来确定应更新叠加层),则在 overlayView 上调用上述方法之一将导致它重新渲染地图上的该点( ie-canDrawMapRect:zoomScale:
将被再次调用,-drawMapRect:zoomScale:inContext:
如果前者返回 YES 则将被调用)。
更新:
如果您不确定需要重新渲染哪个 mapRect,您可以使用该MKMapRectWorld
常量作为 mapRect — 我相信这会导致整个地图的覆盖重新加载(一旦可见)。
使用MKAnnotations
. 您可以更改它们的坐标。只需禁用任何与触摸相关的东西。您需要自己的绘图代码来绘制注释,OpenGL 可能会做到这一点。没有人会知道其中的区别。
这似乎迫使地图刷新叠加层。可能还有注释。
[self.mapView setCenterCoordinate:self.mapView.centerCoordinate];
实际上,我不得不强制覆盖视图使路径无效,在设置新路径之前清除旧路径。[多边形视图无效路径]。告诉地图视图它需要显示刷新对我来说是不够的。
如果多边形的边界矩形发生变化,则raw 存在问题,setNeedsDisplay
然后 MKMapView 将无法正确更新整个矩形,其次,MKPolygon/MKPolygonRenderer
多边形不可更新,添加/删除管道的问题是更新请求过多MapView 它可以在管道中变慢,如果我添加/删除多边形中有更新,我目前使用 30Hz 线程循环
Swift 3+更新,这对我有用,感谢@zenchemical 的启发。
DispatchQueue.main.async {
self.map.add(overlay, level: .aboveRoads)
self.map.setCenter(self.map.centerCoordinate, animated: false)
}
旁注,我不禁觉得这不应该是必要的,并且有一个更合适的解决方案,但是,我还没有找到它。即使添加命令被分派到主队列,在我移动地图之前,覆盖不会再现地呈现。