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.
MKOverlayPathView ha una proprietà '-path' che è stata impostata direttamente con CGPathRef. Sei confuso su come creare un CGPathRef? –