18

i want display a point to point route inside my mapView, i use this code for create the route:

- (IBAction)backToYourCar {
    MKPlacemark *sourcePlacemark = [[MKPlacemark alloc] initWithCoordinate:self.annotationForCar.coordinate addressDictionary:nil];
    NSLog(@"coordiante : locationIniziale %f", sourcePlacemark.coordinate.latitude);
    MKMapItem *carPosition = [[MKMapItem alloc] initWithPlacemark:sourcePlacemark];
    MKMapItem *actualPosition = [MKMapItem mapItemForCurrentLocation];
    NSLog(@"coordiante : source %f, ActualPosition %f", carPosition.placemark.coordinate.latitude ,actualPosition.placemark.coordinate.latitude);
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
    request.source = actualPosition;
    request.destination = carPosition;
    request.requestsAlternateRoutes = YES;

    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
        if (error) {
            NSLog(@"Error : %@", error);
        }
        else {
            [self showDirections:response]; //response is provided by the CompletionHandler
        }
    }];
}

and this for show the route on the map:

- (void)showDirections:(MKDirectionsResponse *)response
{
    for (MKRoute *route in response.routes) {
        [self.mapView addOverlay:route.polyline level:MKOverlayLevelAboveRoads];
    }
}

actually this code does nothing.

if i try to print the the distance of route i get the correct value:

route distance: 1910.000000

then the route is right, but i can't understand why it doesn't appear on the map!

Any suggestions?

Max_Power89
  • 1,710
  • 1
  • 21
  • 38

1 Answers1

50

after a day of research i have solved with this 3 steps:

  1. Set the delegate (self.mapView.delegate = self).
  2. import the MKMapViewDelegate
  3. Implemente the new iOS7 MapView delegate method: - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay(id<MKOverlay>)overlay:

this is my implementation:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKPolyline class]]) {
        MKPolyline *route = overlay;
        MKPolylineRenderer *routeRenderer = [[MKPolylineRenderer alloc] initWithPolyline:route];
        routeRenderer.strokeColor = [UIColor blueColor];
        return routeRenderer;
    }
    else return nil;
}

this method is automatically called by the delegate when you add the polyline on the map.

Max_Power89
  • 1,710
  • 1
  • 21
  • 38
  • When I add MKPolyLine in MKMapView, I am getting bad aceess crash.Detail is here http://stackoverflow.com/questions/18956149/adding-mkpolyline-overlay-to-mkmapview-crashes-application Can you figure out any solution?? – Mobile Developer iOS Android Sep 24 '13 at 07:01
  • Thanks so much for that delegate method! – socca1157 Nov 02 '13 at 22:07
  • 1
    I was stuck with this, too, because I missed the delegate method. Apple should definitely include this hint in the docs for the [Location and Maps Programming Guide](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/ProvidingDirections/ProvidingDirections.html#//apple_ref/doc/uid/TP40009497-CH8-SW15). – IsaacKleiner Jan 22 '15 at 14:58