2011-01-25 8 views
14

Ho esaminato la documentazione di riferimento della classe iOS di Apple e purtroppo non ne sono più saggia. Ho scaricato il codice di esempio KMLViewer ma l'hanno complicato eccessivamente ... Tutto quello che voglio veramente sapere è come generare un percorso e aggiungerlo allo MKMapView. La documentazione parla di usare un CGPathRef, ma in realtà non spiega come.Qualcuno ha qualche esempio su come creare un percorso usando MKOverlayPathView?

Qualcuno potrebbe aiutarmi o indicarmi la direzione giusta per favore? Grazie!

+0

MKOverlayPathView ha una proprietà '-path' che è stata impostata direttamente con CGPathRef. Sei confuso su come creare un CGPathRef? –

risposta

20

Ecco come generare un percorso e aggiungerlo come sovrapposizione a MKMapView. Userò uno MKPolylineView, che è una sottoclasse di MKOverlayPathView e ti protegge dal dover fare riferimento a qualsiasi CGPath poiché si crea invece un MKPolyline (contenente i dati del percorso) e lo si usa per creare il MKPolylineView (la rappresentazione visiva dei dati sulla mappa).

Il MKPolyline deve essere creato con un array di punti C (MKMapPoint) o un array C di coordinate (CLLocationCoordinate2D). È un peccato che MapKit non usi strutture dati più avanzate come NSArray, ma così sia! Suppongo che tu disponga di uno NSArray o NSMutableArray di CLLocation oggetti per dimostrare come convertire in un array C di dati adatto per lo MKPolyline. Questo array è chiamato locations e il modo in cui lo riempi verrà determinato dalla tua app, ad es. compilato elaborando posizioni tocco dall'utente, o pieni di dati scaricati da un web service ecc

Nel regolatore vista che è responsabile della 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]; 
} 

noti che è self.polyline dichiarato nel .h come:

@property (nonatomic, retain) MKPolyline* polyline; 

Questo regolatore visualizzazione deve anche implementare il metodo 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; 
} 

Puoi giocare con le proprietà fillColor, strokeColor e lineWidth per assicurarti che siano appropriate per la tua app. Sono appena andato con una linea bianca semplice, moderatamente ampia, qui.

Se si desidera rimuovere il percorso dalla mappa, ad es. ad aggiornarlo con alcune nuove coordinate, allora si dovrebbe fare:

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

e poi ripetere il processo di cui sopra per creare un nuovo MKPolyline e aggiungerlo alla mappa.

Anche se a prima vista MapKit può sembrare un po 'spaventoso e complesso, può essere facile fare alcune cose come illustrato in questo esempio. L'unico bit spaventoso - per i programmatori non C almeno - è l'uso di malloc per creare un buffer, copiare in CLLocationCoordinates usando la sintassi dell'array e quindi liberare il buffer di memoria in seguito.

+0

Spiegazione molto bella ... Hai salvato la mia giornata ... Grazie mille. – viral

+0

Non funziona. Dov'è il metodo delegate, che imposta le proprietà visive della polilinea (vista), chiamata da? Ho inserito un registro al suo interno e ho notato che non viene mai chiamato. Sto facendo qualcosa di sbagliato? –

+0

Hai reso il tuo controller di visualizzazione un 'MKMapViewDelegate'?Questo è ciò che risulterà nella chiamata a 'mapView: viewForOverlay'. –

Problemi correlati