【问题标题】:MKPolyline with different colors in Objective cObjective c中不同颜色的MKPolyline
【发布时间】:2017-06-02 19:06:35
【问题描述】:

如何用不同的颜色和图案绘制多个MKPolyline

  • 我想画两个MKPolylines
  • 一个蓝色实线
  • 第二个带有红色虚线图案

我可以区分图案,但不能区分颜色 这是我的代码

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[self.myPolyline class]])
    {

        MKPolylineRenderer *renderer1 = [[MKPolylineRenderer alloc]initWithPolyline:overlay];
        UIColor *routeColor = [UIColor blueColor];
        renderer1.strokeColor = routeColor;
        renderer1.lineWidth = 5;

        return renderer1;
    }
    if ([overlay isKindOfClass:[self.myDottedPolyline class]])
    {
        //sets the pattern to a line 2 points long followed by a 1 point gap.
        //renderer.lineDashPattern = @[@2, @1];

        MKPolylineRenderer *renderer2 = [[MKPolylineRenderer alloc]initWithPolyline:overlay];
        UIColor *liveRouteColor = [UIColor redColor];
        renderer2.lineWidth = 7;
        renderer2.lineDashPattern = @[@20,@3];
        renderer2.strokeColor = liveRouteColor;

        return renderer2;
    }

    return nil;
}

【问题讨论】:

  • 您是如何在地图中添加 MKPolyline 的,您可以添加该代码吗?
  • [self.sampleMap addOverlay:self.myPolyline]; [self.sampleMap addOverlay:self. myDottedPolyline]
  • 好的,现在可以添加屏幕截图吗?
  • renderer2.lineDashPattern = @[@20,@3]; 这条线可能会创建长虚线,我认为您需要使用较小的虚线,例如 @2 或 @5
  • 我想要长虚线图案,但它正在绘制点

标签: objective-c mkmapview mapkit mkpolyline


【解决方案1】:

我使用下面的代码来区分折线颜色和图案, 但它正在打印 //Renderer 2 print renderer 2 只执行一次。 之后它再次跳转到渲染器 1。

    -(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
    {
       UIColor *BlueRoute = [UIColor colorWithRed:0/255.0f green:104/255.0f blue:163/255.0f alpha:1.0f];
       UIColor *redRoute = [UIColor colorWithRed:241/255.0f green:122/255.0f blue:6/255.0f alpha:1.0f];


        if ([overlay isMemberOfClass:[_myPolyline class]])
        {
            MKPolylineRenderer *renderer1 = [[MKPolylineRenderer alloc]initWithPolyline:overlay];

                NSLog(@"Renderer : %@",renderer1);
                renderer1.lineWidth = 5;
                renderer1.path = (__bridge CGPathRef _Nullable)(self.myPolyline);
                [renderer1 createPath];
                [renderer1 invalidatePath];
                [renderer1 setNeedsDisplay];
                renderer1.strokeColor = BlueRoute;

                if (_myPolyline.isAccessibilityElement == TRUE)
                {
                    NSLog(@"Renderer Color : %@",renderer1);
                    renderer1.fillColor = BlueRoute;
                }

                return renderer1;


        }



        if ([overlay isMemberOfClass:[_myDottedPolyline class]] )
        {
            MKPolylineRenderer *renderer2 = [[MKPolylineRenderer alloc]initWithPolyline:overlay];
//Renderer 2 print
            NSLog(@"Renderer 2 : %@",renderer2);

                renderer2.lineWidth = 7;
                renderer2.lineDashPattern = @[@20,@3];
                [renderer2 setNeedsDisplay];
                renderer2.path = (__bridge CGPathRef _Nullable)(self.myDottedPolyline);
                [renderer2 createPath];
                [renderer2 invalidatePath];
                renderer2.strokeColor = redRoute;


                if (_myDottedPolyline.isAccessibilityElement == FALSE)
                {
                   //Renderer 2 print 
                  NSLog(@"Renderer 2 Color: %@",renderer2);

                    renderer2.fillColor = redRoute;

                }

                return renderer2;

                //sets the pattern to a line 2 points long followed by a 1 point gap.
                //renderer.lineDashPattern = @[@2, @1];

        }
            return nil;
    }

【讨论】:

    【解决方案2】:

    假设您想要两种类型之王的叠加层,我会 使用 BOOL 属性控制覆盖类型,如果可以说, 简单路由添加此覆盖,如果是高级路由添加 其他叠加。 [self.myPolyline 类] 和 [self.myDottedPolyline class] 可以是同一类 >> id。

    @property(nonatomic,assign) BOOL isDottedPolyline; 
    
    
      -(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
        {
           UIColor *BlueRoute = [UIColor colorWithRed:0/255.0f green:104/255.0f blue:163/255.0f alpha:1.0f];
           UIColor *redRoute = [UIColor colorWithRed:241/255.0f green:122/255.0f blue:6/255.0f alpha:1.0f];
    
    
            if (!self.isDottedPolyline)
            {
                MKPolylineRenderer *renderer1 = [[MKPolylineRenderer alloc]initWithPolyline:overlay];
    
                    NSLog(@"Renderer : %@",renderer1);
                    renderer1.lineWidth = 5;
                    renderer1.path = (__bridge CGPathRef _Nullable)(self.myPolyline);
                    [renderer1 createPath];
                    [renderer1 invalidatePath];
                    [renderer1 setNeedsDisplay];
                    renderer1.strokeColor = BlueRoute;
    
                    if (_myPolyline.isAccessibilityElement == TRUE)
                    {
                        NSLog(@"Renderer Color : %@",renderer1);
                        renderer1.fillColor = BlueRoute;
                    }
    
                    return renderer1;
    
    
            }
        else if(self.isDottedPolyline){
    
                MKPolylineRenderer *renderer2 = [[MKPolylineRenderer alloc]initWithPolyline:overlay];
    //Renderer 2 print
                NSLog(@"Renderer 2 : %@",renderer2);
    
                    renderer2.lineWidth = 7;
                    renderer2.lineDashPattern = @[@20,@3];
                    [renderer2 setNeedsDisplay];
                    renderer2.path = (__bridge CGPathRef _Nullable)(self.myDottedPolyline);
                    [renderer2 createPath];
                    [renderer2 invalidatePath];
                    renderer2.strokeColor = redRoute;
    
    
                    if (_myDottedPolyline.isAccessibilityElement == FALSE)
                    {
                       //Renderer 2 print 
                      NSLog(@"Renderer 2 Color: %@",renderer2);
    
                        renderer2.fillColor = redRoute;
    
                    }
    
                    return renderer2;
    
                    //sets the pattern to a line 2 points long followed by a 1 point gap.
                    //renderer.lineDashPattern = @[@2, @1];
    
            } else{
                return nil; }
        }
    

    我假设你使用两个 MKPolylineRenderer 用于 2 个不同的目的,当你想创建一个点时使用 self.isDottedPolyline 为 true,当你想写另一个时,将其设置为 false,在两个注释之间,当你使用

    [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
            //  //NSLog(@"Found placemarks: %@, error: %@", placemarks, error);
            if (error == nil && [placemarks count] > 0) {
        if (I WANT DOTED POLYLINE)
           self. isDottedPolyline = YES;
        else
           self. isDottedPolyline = NO;
    
    }
    }];
    

    您将 self.isDottedPolyline 设置为 true 或 false,然后 poliline 将根据您的需要呈现,当它转到 -(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id&lt;MKOverlay&gt;)overlay 时,它将查看哪个是 true,dotted 与否。

    【讨论】:

    • 你能参考上面的编辑并提出一些改变
    猜你喜欢
    • 2013-02-01
    • 2015-03-29
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多