【问题标题】:MKPolyline / MKPolylineRenderer changing color without remove itMKPolyline / MKPolylineRenderer 改变颜色而不移除它
【发布时间】:2015-05-12 09:32:59
【问题描述】:

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

那么有可能吗?

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

【问题讨论】:

    标签: ios mapkit mkpolyline


    【解决方案1】:

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

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

    Apple's Breadcrumb sample app 还提供了一个自定义渲染器示例,您可能会发现它很有用。


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

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

    不确定您想要什么,但您可以通过更改颜色并以定时步骤逐渐调用 invalidatePath 来“动画化”颜色从蓝色变为红色。

    另一个重要的事情是确保rendererForOverlay delegate 方法也使用行的“当前”颜色,以防地图视图在您更改渲染器的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;
    }
    

    【讨论】:

    • 谢谢你的回答,我明天试试,告诉你结果。
    • 谢谢,您的回答非常清晰,非常适合制作我想要的东西。此外,如果我可以询问如何使这条线平滑地改变颜色(比如以非常小的比例调整 rgb?)或者让它动画改变颜色。 (或者如果这不是正确的提问地方,请忽略这些,我会提出更多生动的问题)
    • 您的后续问题听起来很复杂。我建议做一些研究,如果可能的话尝试一些东西,然后发布另一个包含详细信息的问题,我建议包括你想要达到的目标的小图或屏幕截图。
    • 现在这很有帮助!从地图视图中获取渲染器是诀窍,如果不是这个答案,我不知道谢谢。
    【解决方案2】:

    你应该看看 MKOverlayPathRenderer 方法 - invalidatePath.

    从文档中,它说:

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

    所以,此时,您应该可以更改绘图颜色。

    【讨论】:

    • 谢谢你的回答,我明天试试,现在是我所在时区的晚上。
    • 请原谅我将上述答案标记为正确。你的答案也正确,但另一个更清楚并有一个例子。但我也赞成你的回答,谢谢。
    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2014-04-19
    • 2021-08-31
    相关资源
    最近更新 更多