7

我正在使用地图应用程序,我想问如何在不删除的情况下更改折线颜色并再次添加,我找到了这个主题https://stackoverflow.com/questions/24226290/mkpolylinerenderer-change-color-without-removing-在stackoverflow中叠加,但这与我的问题无关,我没有触及线,所以不需要做-[MKMapViewDelegate mapView:didSelectAnnotationView:]

那么有可能做到这一点吗?

编辑:我想要做的是平滑地更改折线颜色(通过着色颜色 - 听起来像动画)如果您对如何动画这条折线有任何想法也请告诉我。谢谢

4

2 回答 2

8

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

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

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


但是,如果您只想更新线条的颜色(例如从蓝色变为红色),则可以按如下方式进行:

  1. 获取MKPolyline要更改的参考。
  2. 获取对步骤 1 中获得的折线的引用MKPolylineRenderer。这可以通过调用地图视图的rendererForOverlay:实例方法来完成(与mapView:rendererForOverlay:委托方法不同。
  3. 更新渲染器的strokeColor.
  4. 调用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;
}
于 2015-05-12T14:19:13.757 回答
2

你应该看看 MKOverlayPathRenderer 方法 - invalidatePath

从文档中,它说:

当路径信息的更改需要您重新创建覆盖的路径时调用此方法。此方法将 path 属性设置为 nil 并告诉覆盖渲染器重新显示其内容。

因此,此时,您应该能够更改绘图颜色。

于 2015-05-12T14:31:00.297 回答