2011-01-25 9 views
14

Przeglądałem dokumentację klasową Apple iOS Class Reference i niestety nie jestem mądrzejszy. Pobrałem ich przykładowy kod: KMLViewer, ale udało im się go zneutralizować ... Wszystko, co naprawdę chcę wiedzieć, to wygenerować ścieżkę i dodać ją do MKMapView. Dokumentacja mówi o używaniu CGPathRef, ale tak naprawdę nie wyjaśnia, w jaki sposób.Czy ktoś ma przykłady, jak utworzyć ścieżkę przy użyciu MKOverlayPathView?

Czy ktoś może mi pomóc lub skierować mnie we właściwym kierunku, proszę? Dzięki!

+0

MKOverlayPathView ma właściwość '-path', którą można bezpośrednio ustawić za pomocą CGPathRef. Czy jesteś zdezorientowany, jak utworzyć CGPathRef? –

Odpowiedz

20

Oto jak wygenerować ścieżkę i dodać ją jako nakładkę do MKMapView. Mam zamiar użyć MKPolylineView, który jest podklasą MKOverlayPathView i chroni przed odniesieniem się do każdego CGPath, ponieważ zamiast tego tworzysz MKPolyline (zawierający dane o ścieżce) i używasz go do utworzenia MKPolylineView (reprezentacja wizualna danych na mapie).

Należy utworzyć MKPolyline z tablicą C punktów (MKMapPoint) lub tablicą C o współrzędnych (CLLocationCoordinate2D). Szkoda, że ​​MapKit nie używa bardziej zaawansowanych struktur danych, takich jak NSArray, ale niech tak będzie! Zakładam, że masz obiekty NSArray lub NSMutableArray z CLLocation, aby pokazać, jak przekonwertować na tablicę C danych odpowiednich dla MKPolyline. Ta tablica nazywa się locations, a sposób jej wypełnienia zależy od Twojej aplikacji - np. wypełnione przez przetwarzanie lokalizacje dotykowych przez użytkownika, lub wypełnione danymi pobranymi z usługi internetowej itp

W kontrolerze widoku, który jest odpowiedzialny za MKMapView:

int numPoints = [locations count]; 
if (numPoints > 1) 
{ 
    CLLocationCoordinate2D* coords = malloc(numPoints * sizeof(CLLocationCoordinate2D)); 
    for (int i = 0; i < numPoints; i++) 
    { 
     CLLocation* current = [locations objectAtIndex:i]; 
     coords[i] = current.coordinate; 
    } 

    self.polyline = [MKPolyline polylineWithCoordinates:coords count:numPoints]; 
    free(coords); 

    [mapView addOverlay:self.polyline]; 
    [mapView setNeedsDisplay]; 
} 

Należy pamiętać, że jest self.polyline zadeklarowane w .h jako:

@property (nonatomic, retain) MKPolyline* polyline; 

Ten kontroler widoku powinny również wdrożyć metodę MKMapViewDelegate:

- (MKOverlayView*)mapView:(MKMapView*)theMapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    MKPolylineView* lineView = [[[MKPolylineView alloc] initWithPolyline:self.polyline] autorelease]; 
    lineView.fillColor = [UIColor whiteColor]; 
    lineView.strokeColor = [UIColor whiteColor]; 
    lineView.lineWidth = 4; 
    return lineView; 
} 

Można odtwarzać właściwości fillColor, strokeColor i lineWidth, aby upewnić się, że są odpowiednie dla danej aplikacji. Właśnie przeszedłem z prostą, umiarkowanie szeroką białą linią tutaj.

Jeśli chcesz usunąć ścieżkę z mapy, np. zaktualizować go z kilkoma nowymi współrzędnymi, wtedy można zrobić:

[mapView removeOverlay:self.polyline]; 
self.polyline = nil; 

a następnie powtórzyć powyższy proces, aby utworzyć nowy MKPolyline i dodać go do mapy.

Chociaż na pierwszy rzut oka MapKit może wyglądać nieco przerażająco i skomplikowanie, może być łatwo zrobić kilka rzeczy, jak pokazano w tym przykładzie. Jedynym przerażającym bitem - przynajmniej dla programistów spoza C - jest użycie malloc do stworzenia bufora, skopiowanie do niego współrzędnych CLLocationCo przy użyciu składni tablic, a następnie zwolnienie bufora pamięci.

+0

Bardzo ładne wyjaśnienie ... Uratowałeś mi dzień ... Dziękuję bardzo. – viral

+0

Nie działa. Gdzie jest metoda delegata, która ustawia wizualne właściwości polilinii (widoku), wywołanej z? Włożyłem do niej dziennik i zauważyłem, że nigdy się nie nazywa. Czy robię coś źle? –

+0

Czy uczyniłeś kontroler widoku 'MKMapViewDelegate'?To właśnie spowoduje wywołanie 'mapView: viewForOverlay'. –

Powiązane problemy