2009-12-16 11 views
17

Vorrei consentire all'utente della mia app di scegliere una posizione sulla mappa. La mappa nativa ha una funzione "drop pin" in cui è possibile individuare qualcosa facendo cadere un pin. Come posso farlo in MapKit?Come faccio a rilasciare un pin con MapKit?

+0

Se c'è qualcosa che posso chiarire con la mia risposta. Per favore mi faccia sapere. – RedBlueThing

+0

Quando questo è stato scritto, c'erano almeno due buone risposte tra cui scegliere. Fai la tua scelta. – JugsteR

risposta

27

È necessario creare un oggetto che implementa l'MKAnnotation protocollo e quindi aggiungere l'oggetto al MKMapView:

@interface AnnotationDelegate : NSObject <MKAnnotation> { 
    CLLocationCoordinate2D coordinate; 
    NSString * title; 
    NSString * subtitle; 
} 

istanzia l'oggetto delegato e aggiungerlo alla mappa:

AnnotationDelegate * annotationDelegate = [[[AnnotationDelegate alloc] initWithCoordinate:coordinate andTitle:title andSubtitle:subt] autorelease]; 
[self._mapView addAnnotation:annotationDelegate]; 

La mappa accederà alle proprietà delle coordinate sul tuo AnnotationDelegate per scoprire dove mettere il segnaposto sulla mappa.

Se si desidera personalizzare la vostra vista annotazione è necessario implementare il MKMapViewDelegateviewForAnnotation metodo sulla vostra mappa View Controller:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 

Se si desidera implementare la funzionalità perno di trascinamento è possibile leggi come gestire gli eventi di tocco di annotazione nello Apple OS Reference Library.

È inoltre possibile controllare this article in trascinamento con mapkit che fa riferimento a una libreria di campioni funzionante su GitHub. È possibile ottenere le coordinate della annotazione trascinato controllando i _coordinates membro sul DDAnnotation oggetto.

+0

C'è un buon post sul blog e un codice di esempio per il trascinamento delle annotazioni qui: http://hollowout.blogspot.com/2009/07/mapkit-annotation-drag-and-drop-with.html – RedBlueThing

+0

La cosa è anche se tu sono in grado di trascinare, si sarebbe in grado di ottenere la posizione del pin dopo aver finito di trascinare? – erotsppa

+0

Ho aggiornato la mia risposta con un po 'più di dettaglio sul materiale drag-drop. – RedBlueThing

23

Ci sono diversi modi per cadere uno spillo, e non si specifica in che modo farlo nella sua interrogazione. Il primo modo è di farlo a livello di programmazione, in quanto è possibile utilizzare ciò che RedBlueThing ha scritto, tranne che non hai realmente bisogno di una classe personalizzata (a seconda della versione di iOS che stai utilizzando). Per iOS 4.0 e versioni successive è possibile utilizzare questo frammento di cadere di programmazione un perno:

// Create your coordinate 
CLLocationCoordinate2D myCoordinate = {2, 2}; 
//Create your annotation 
MKPointAnnotation *point = [[MKPointAnnotation alloc] init]; 
// Set your annotation to point at your coordinate 
point.coordinate = myCoordinate; 
//If you want to clear other pins/annotations this is how to do it 
for (id annotation in self.mapView.annotations) { 
    [self.mapView removeAnnotation:annotation]; 
} 
//Drop pin on map 
[self.mapView addAnnotation:point]; 

Se si vuole essere in grado di cadere uno spillo, ad esempio, lungo premendo sul MapView vero e proprio, si può fare in questo modo:

// Create a gesture recognizer for long presses (for example in viewDidLoad) 
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
lpgr.minimumPressDuration = 0.5; //user needs to press for half a second. 
[self.mapView addGestureRecognizer:lpgr] 


- (void)handleLongPress:(UIGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) { 
     return; 
    } 
    CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView]; 
    CLLocationCoordinate2D touchMapCoordinate = [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView]; 
    MKPointAnnotation *point = [[MKPointAnnotation alloc] init]; 
    point.coordinate = touchMapCoordinate; 
    for (id annotation in self.mapView.annotations) { 
     [self.mapView removeAnnotation:annotation]; 
    } 
    [self.mapView addAnnotation:point]; 
} 

Se si desidera enumerare tutte le annotazioni, è sufficiente utilizzare il codice in entrambi gli snippet. Ecco come si registrano le posizioni per tutte le annotazioni:

for (id annotation in self.mapView.annotations) { 
    NSLog(@"lon: %f, lat %f", ((MKPointAnnotation*)annotation).coordinate.longitude,((MKPointAnnotation*)annotation).coordinate.latitude); 
} 
+0

questa domanda ha risposto a cosa ha chiesto @erotsppa – JProgrammer

2

Potrebbe anche essere necessario impostare il delegato di MapView.

[mkMapView setDelegate:self]; 

Poi chiamare il suo delegato, viewForAnnotation:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{ 
    MKPinAnnotationView *pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                    reuseIdentifier:@"current"]; 
    pinAnnotationView.animatesDrop = YES; 
    pinAnnotationView.pinColor = MKPinAnnotationColorRed; 
    return pinAnnotationView; 
} 
8

è possibile ottenere toccati posizione da, jcesarmobile risposta su ottenere sfruttato coordinates with iphone mapkit e si può cadere uno spillo in qualsiasi luogo come muggito

// Define pin location 
CLLocationCoordinate2D pinlocation; 
pinlocation.latitude = 51.3883454 ;//set latitude of selected coordinate ; 
pinlocation.longitude = 1.4368011 ;//set longitude of selected coordinate; 

// Create Annotation point 
MKPointAnnotation *Pin = [[MKPointAnnotation alloc]init]; 
Pin.coordinate = pinlocation; 
Pin.title = @"Annotation Title"; 
Pin.subtitle = @"Annotation Subtitle"; 

// add annotation to mapview 
[mapView addAnnotation:Pin]; 
Problemi correlati