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示例应用程序也有一个自定义渲染器的例子,您可能会觉得有用。
但是,如果您只是想更新线条的颜色(比如说从蓝色到红色),那么您可以这样做,如下所示:
- 获取要更改的
MKPolyline
的引用。 - 获取对在第1步中获取的折线的
MKPolylineRenderer
的引用。可以通过调用地图视图的rendererForOverlay:
instance方法(与mapView:rendererForOverlay:
delegate方法不同)来完成此操作。 - 更新渲染器的
strokeColor
。 - 在渲染器上调用
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属性设置为零,并通知覆盖渲染器重新显示其内容。
所以,在这个时候,你应该可以改变你的绘画颜色。