2014-01-25 3 views
1

Так что я хочу, чтобы отобразить, где пользователь моего приложения в прошлись по MKMapView, я собираю ДАННЫЕ со следующим кодом:MAPview viewForOverlay никогда не называли

#pragma mark - CLLocationManagerDelegate 
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation { 

    // calc. distance walked 
    CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation]; 
    self.totalMetters += meters; 
    [[self labelDistance] setText:[self formatDistanceIntoString:self.totalMetters]]; 

    // create another annotation 
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; 
    annotation.coordinate = newLocation.coordinate; 

    // Also add to our map so we can remove old values later 
    [self.locations addObject:annotation]; 

    // Remove values if the array is too big 
    while (self.locations.count > 100) 
    { 
     annotation = [self.locations objectAtIndex:0]; 
     [self.locations removeObjectAtIndex:0]; 

     // Also remove from the map 
     [self.map removeAnnotation:annotation]; 
    } 

После того, как он закончил, я называю мой метод рисования:

[self drawRoute]; 

Который содержит следующее:

- (void)drawRoute { 

    NSLog(@"drawRoute"); 
    NSInteger pointsCount = self.locations.count; 

    CLLocationCoordinate2D pointsToUse[pointsCount]; 

    for(int i = 0; i < pointsCount; i++) { 
     MKPointAnnotation *an = [self.locations objectAtIndex:i]; 
     pointsToUse[i] = CLLocationCoordinate2DMake(an.coordinate.latitude,an.coordinate.latitude); 
    } 

    MKPolyline *myPolyline = [MKPolyline polylineWithCoordinates:pointsToUse count:pointsCount]; 

    [self.map addOverlay:myPolyline]; 
} 

Наконец мой mapView дель Egate:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { 
    NSLog(@"route"); 
    if ([overlay isKindOfClass:MKPolyline.class]) { 
     MKPolylineView *lineView = [[MKPolylineView alloc] initWithOverlay:overlay]; 
     lineView.strokeColor = [UIColor greenColor]; 

     return lineView; 
    } 
    return nil; 
} 

Очевидно мой контроллер MKMapView Делегат соответствует

@interface NewWalkViewController : UIViewController <CLLocationManagerDelegate, MKMapViewDelegate> 

И в mapView в Storyboard связан с контроллером (на выходе и делегата)

Я использую "велосипед дороги" инструмент для отладки и есть выход:

2014-01-25 20: 27: 3 0,132 Движущаяся собака [2963: 70b] новое место: 37,330435

2014-01-25 20: 27: 30,133 Движущаяся собака [2963: 70b] drawRoute

Как я могу видеть метод для рисования оверлей никогда не вызывается, и у меня нет ни малейшего понятия, как его исправить.

+1

Вы пробовали реализации '- (MKOverlayRenderer *) MAPview: (MKMapView *) MAPview rendererForOverlay: (идентификатор < MKOverlay >) наложение;'? Начиная с iOS 7, «mapView: viewForOverlay:' [устарело] (https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapViewDelegate_Protocol/DeprecationAppendix/AppendixADeprecatedAPI.html). Боюсь, я не сделал достаточно программирования MapKit на iOS 7, чтобы помочь вам в реализации. –

+1

В drawRoute, при настройке точек для использования [i], вы передаете широту для обоих параметров в CLLocationCoordinate2DMake. Кроме того, вы можете просто сказать «pointsToUse [i] = an.coordinate;». – Anna

+0

@JamesFrost: спасибо, я проверил с этим делегатом – Edelweiss

ответ

3

Основная проблема заключается в том, что в drawRoute, эта линия проходит latitude для обоих параметров CLLocationCoordinate2DMake:

pointsToUse[i] = CLLocationCoordinate2DMake 
        (an.coordinate.latitude,an.coordinate.latitude); 

Это приводит к линии втягиваются в другой части мира, чем когда фактическая an.coordinate является , Например, если an.coordinate составляет 37, -122 (где-то рядом с Сан-Франциско), линия рисуется вместо этого на 37,37 (где-то на юге Турции).

Поскольку вы на самом деле не позиционируете карту в неправильном месте (вы ищете линию в «правильном» месте), viewForOverlay никогда не вызывается, потому что карта только вызывает его, когда возможно, что наложение будет видимым ,


Изменить что линия:

pointsToUse[i] = CLLocationCoordinate2DMake 
        (an.coordinate.latitude,an.coordinate.longitude); 

или просто:

pointsToUse[i] = an.coordinate; 


Как отмечает Джеймс Фрост в комментариях, по состоянию прошивкой 7, вы должны использовать rendererForOverlay вместо viewForOverlay, хотя вид карты по-прежнему вызывает viewForOverlay в iOS 7, если rendererForOverlay не был реализован. Хотя это не мешает отображению наложения в текущем случае, вы должны реализовать новый метод делегирования, а также старый (если приложение iOS 7 также будет работать на iOS 6 или ранее).


Другая важная, но не связанная с этим проблема заключается в том, что вы произвольно создаете многократные перекрывающиеся накладки. В drawRoute, поскольку созданный вами наложение включает в себя все мест, вы должны удалить все существующие накладки перед добавлением нового. В противном случае карта заканчивается оверлеем для местоположения от 0 до 1, наложением для местоположения от 0 до местоположения 2, наложением для местоположения от 0 до местоположения 3 и т. Д. Предыдущие накладки явно не видны, поскольку они имеют один и тот же цвет и линию ширина. Перед addOverlay линии, говоря:

[self.map removeOverlays:self.map.overlays]; 
+0

Я попробую и дам вам несколько отзывов, спасибо! – Edelweiss

+1

Работал как шарм! Ты обалденный :) – Edelweiss

Смежные вопросы