复杂的动画或阴影/渐变可能需要创建自定义叠加渲染器类。
这些其他答案提供了有关如何绘制渐变折线的想法,并且动画也最需要自定义叠加渲染器:
Apple 的 Breadcrumb 示例应用程序也有一个自定义渲染器示例,您可能会发现它很有用。
但是,如果您只想更新线条的颜色(例如从蓝色变为红色),则可以按如下方式进行:
- 获取
MKPolyline
要更改的参考。
- 获取对步骤 1 中获得的折线的引用
MKPolylineRenderer
。这可以通过调用地图视图的rendererForOverlay:
实例方法来完成(与mapView:rendererForOverlay:
委托方法不同。
- 更新渲染器的
strokeColor
.
- 调用
invalidatePath
渲染器。
不确定您想要什么,但您可以通过更改颜色并逐步调用 invalidatePath 来“动画化”从蓝色变为红色的颜色。
另一个重要的事情是确保rendererForOverlay
委托方法也使用线的“当前”颜色,以防地图视图在您strokeColor
直接更改渲染器后调用委托方法。
否则,在平移或缩放地图后,折线的颜色将变回委托方法中设置的颜色。
您可以将线条的当前颜色保存在类级变量中,并在委托方法和要更改线条颜色的地方使用它。
类级别变量的替代方法(可能更好)是使用 MKPolyline 的title
属性来保存其颜色,或者使用具有颜色属性的自定义折线覆盖类(不是渲染器)。
例子:
@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;
}