MKPolyline / MKPolylineRenderer改变颜色而不删除它

我与地图应用程序工作,我想问如何更改折线颜色不删除,并再次添加,我发现这个话题https://stackoverflow.com/questions/24226290/mkpolylinerenderer-change-color-without-removing-叠加在stackoverflow但这不涉及我的问题,我没有触及行,所以不需要做-[MKMapViewDelegate mapView:didSelectAnnotationView:]

那么有可能做到这一点?

编辑:我想要做的是平滑地改变折线颜色(通过阴影颜色 – 声音像animation)如果你有任何想法如何animation这个折线,请也告诉我。 谢谢

复杂的animation或阴影/渐变可能需要创build自定义的叠加渲染器类。

这些其他答案给出了关于如何绘制渐变多段线的想法,animation也最需要自定义的叠加渲染器:

  • 如何自定义MKPolyLineView来绘制不同的样式线
  • 与MapKit ios的渐变折线
  • 在MKPolyLineView中绘制CAGradient

Apple的Breadcrumb示例应用程序也有一个自定义渲染器的例子,您可能会觉得有用。

但是,如果您只是想更新线条的颜色(比如说从蓝色到红色),那么您可以这样做,如下所示:

  1. 获取要更改的MKPolyline的引用。
  2. 获取对在第1步中获取的折线的MKPolylineRenderer的引用。可以通过调用地图视图的rendererForOverlay: instance方法(与mapView:rendererForOverlay: delegate方法不同)来完成此操作。
  3. 更新渲染器的strokeColor
  4. 在渲染器上调用invalidatePath

不知道你想要什么,但你可能能够通过改变颜色“animation”颜色从蓝色到红色,并逐步调用invalidatePath。

另一个重要的事情是确保rendererForOverlay 委托方法也使用线的“当前”的颜色,以防在地图视图直接更改渲染器的strokeColor后调用委托方法。

否则,在平移或缩放地图之后,多段线的颜色将变回到委托方法中设置的任何值。

您可以将线条的当前颜色保留在类级variables中,并在代理方法和要更改线条颜色的位置使用该颜色。

类级别variables(也许更好)的替代方法是使用MKPolyline的title属性来保存其颜色,或者使用color属性使用自定义折线叠加类(不是渲染器)。

例:

 @property (nonatomic, strong) UIColor *lineColor; //If you need to keep track of multiple overlays, //try using a NSMutableDictionary where the keys are the //overlay titles and the value is the UIColor. -(void)methodWhereYouOriginallyCreateAndAddTheOverlay { self.lineColor = [UIColor blueColor]; //line starts as blue MKPolyline *pl = [MKPolyline polylineWithCoordinates:coordinates count:count]; pl.title = @"test"; [mapView addOverlay:pl]; } -(void)methodWhereYouWantToChangeLineColor { self.lineColor = theNewColor; //Get reference to MKPolyline (example assumes you have ONE overlay)... MKPolyline *pl = [mapView.overlays objectAtIndex:0]; //Get reference to polyline's renderer... MKPolylineRenderer *pr = (MKPolylineRenderer *)[mapView rendererForOverlay:pl]; pr.strokeColor = self.lineColor; [pr invalidatePath]; } -(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay { if ([overlay isKindOfClass:[MKPolyline class]]) { MKPolylineRenderer *pr = [[MKPolylineRenderer alloc] initWithPolyline:overlay]; pr.strokeColor = self.lineColor; pr.lineWidth = 5; return pr; } return nil; } 

你应该看看MKOverlayPathRenderer方法- invalidatePath

从文件,它说:

调用此方法时,path信息中的更改将需要您重新创build覆盖的path。 此方法将path属性设置为零,并通知覆盖渲染器重新显示其内容。

所以,在这个时候,你应该可以改变你的绘画颜色。