2013-09-14 3 views
17

я хочу отобразить точку маршрута точки внутри моего MAPview, я использую этот код для создания маршрута:отображения маршрут на IOS 7 карт: addOverlay не имеет никакого эффекта

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

и это для шоу маршрута на карта:

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

на самом деле этот код ничего не делает.

если я пытаюсь напечатать расстояние маршрута я получить правильное значение:

route distance: 1910.000000 

то маршрут является правильным, но я не могу понять, почему он не появляется на карте!

Любые предложения?

+0

Как настроить 'annotationForCar'? Вам нужна координата для всего, чтобы работать ... – Wain

+0

Да, annotationForCar - это MKPointAnnotation, и она корректно отображается на mapView –

ответ

48

после дня исследований я решил с этим 3 шага:

  1. Установите делегат (self.mapView.delegate = self).
  2. импортировать новый iOS7 MapView метод делегата в MKMapViewDelegate
  3. Implemente: - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay(id<MKOverlay>)overlay:

это моя реализация:

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

этот метод автоматически вызывается делегатом, когда вы добавляете полилинии на карте.

+0

Когда я добавляю MKPolyLine в MKMapView, я получаю плохую потерю краса. DETail здесь http: // stackoverflow .com/questions/18956149/add-mkpolyline-overlay-to-mkmapview-crashes-application Можете ли вы найти решение? –

+0

Большое спасибо за этот метод делегата! – socca1157

+1

Я тоже застрял в этом, потому что я пропустил метод делегата. Яблоко должно обязательно включать этот намек в документы для [Руководство по программированию местоположения и карт] (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/ProvidingDirections/ProvidingDirections.html#//apple_ref/DOC/UID/TP40009497-СН8-SW15). – IsaacKleiner