Iphone 在MKMapView上移动/更新MKOverlay

Iphone 在MKMapView上移动/更新MKOverlay,iphone,mkmapview,mkannotation,Iphone,Mkmapview,Mkannotation,是否有方法更新(即移动)已添加到MKMapView的MKOverlay。删除一个旧的和添加一个新的是可怕的(缓慢) i、 e我想在屏幕上移动覆盖时触发调用此函数的后台函数: - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay -(MKOverlayView*)地图视图:(MKMapView*)地图视图覆盖:(id)覆盖 (使用MKAnnotions我想会好一点

是否有方法更新(即移动)已添加到
MKMapView
MKOverlay
。删除一个旧的和添加一个新的是可怕的(缓慢)

i、 e我想在屏幕上移动覆盖时触发调用此函数的后台函数:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
-(MKOverlayView*)地图视图:(MKMapView*)地图视图覆盖:(id)覆盖

(使用
MKAnnotions
我想会好一点,但我不能使用
MKPolyline
MKPolygon
等,而且整个信息会减少到一个点)

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

-(void)setneedsDisplayinPrect:(MKMapRect)mapRect

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

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


更新:


如果您不确定需要重新渲染哪个mapRect,则可以使用
MKMapRectWorld
常量作为mapRect,我相信这将导致整个地图上的覆盖重新加载(一旦可见).

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

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

这似乎是对的强制地图刷新覆盖图。可能还有注释


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

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

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

旁注,我忍不住觉得这应该是不必要的,而且有一个更合适的解决方案,但是,我还没有找到。即使add命令被调度到主队列,覆盖层也不会重复渲染,直到我移动贴图为止。

如果边界矩形多边形的角度发生变化,那么MKMapView将无法正确更新整个矩形,其次,
MKPolygon/MKPolygonRenderer
的多边形是不可更新的,添加/删除管道的问题是,如果有太多的请求更新MapView,那么管道中的速度可能会变慢,如果有u多边形中的更新我确实添加/删除了

添加:为了给您留下我需要此功能的印象:我使用地图视图并在其顶部放置注释来显示卫星的位置。每个卫星还应显示一个示意图(您可以“看到”地平线上方卫星的区域)。此信息(封装外形的位置和形状)必须定期更新。目前我有一个解决方案,其中一个视图是所有足迹,我使用CoreGraphics绘制正确的形状。但我更喜欢使用MKOverlay的解决方案,但我无法使它们动态…有什么想法吗?注释视图保持相同大小,如果你缩放,覆盖大小与缩放比例有关,对吗在我看来,从iOS 7开始,这些方法是在
MKOverlayRenderer
上,而不是
MKOverlayView
上。如果你想更新整个地图,你可以调用
setNeedsDisplay
来设置覆盖动画/移动覆盖?