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

maj*_*oat 7 mapkit ios mkpolyline

我正在使用地图应用程序,我想问如何更改折线颜色而不删除并再次添加它,我发现这个主题/sf/ask/1695840331/叠加在stackoverflow但这不涉及我的问题,我没有触及线,所以没有必要-[MKMapViewDelegate mapView:didSelectAnnotationView:]

这样做有可能吗?

编辑:我想要做的是平滑地改变折线颜色(通过着色颜色 - 像动画一样的声音)如果您对如何设置此折线的动画有任何想法,请同时告诉我.谢谢

小智 8

复杂的动画或着色/渐变可能需要创建自定义叠加渲染器类.

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

Apple的Breadcrumb示例应用程序还有一个自定义渲染器的示例,您可能会发现它很有用.


但是,如果您只想更新线条的颜色(例如从蓝色到红色),那么您可以按照以下方式执行此操作:

  1. 获取MKPolyline您想要更改的参考.
  2. 获取对MKPolylineRenderer步骤1中获得的折线的引用.这可以通过调用地图视图的rendererForOverlay:实例方法(与mapView:rendererForOverlay:委托方法不同)来完成.
  3. 更新渲染器strokeColor.
  4. 调用invalidatePath渲染器.

不确定你想要什么,但你可以通过改变颜色并在定时步骤中逐渐调用invalidatePath来"动画"从蓝色到红色的颜色.

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

否则,在平移或缩放地图后,折线的颜色将变回委托方法中设置的任何颜色.

您可以将线的当前颜色保留在类级变量中,并在委托方法和要更改线的颜色的位置使用它.

类级变量(可能更好)的替代方法是使用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;
}
Run Code Online (Sandbox Code Playgroud)