Reputation: 145
How to draw multiple MKPolyline
with different colors and patterns.
MKPolylines
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
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
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