Poonam K.
Poonam K.

Reputation: 145

MKPolyline with different colors in Objective c

How to draw multiple MKPolyline with different colors and patterns.

I am able to differentiate pattern but its not differentiating colors here is my code

-(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;
}

Upvotes: 0

Views: 1026

Answers (2)

Aragunz
Aragunz

Reputation: 501

Assuming you want overlays for two king of types, I would have controlled the overlay type with a BOOL property, if is lets say, simple route add this overlay, if it is the advanced route add the other overlay. [self.myPolyline class] and [self.myDottedPolyline class] can be same 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; }
    }

I assume you are using two MKPolylineRenderer for 2 different purposes using self.isDottedPolyline to true when u want to create doted one and set it to false when you want to write the other one, between two anotation, and when u use

[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;

}
}];

u set self.isDottedPolyline it to true or false then poliline will be rendered on what you need, and as it goes to -(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay it will see which one is true, doted or not.

Upvotes: 0

Poonam K.
Poonam K.

Reputation: 145

I am using below code to differentiate polyline colors and pattern , but it is printing //Renderer 2 print renderer 2 executing only once. after that it jumps on Renderer 1 again.

    -(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;
    }

Upvotes: 0

Related Questions