2009-12-16 12 views
17

Ich möchte dem Benutzer meiner App erlauben, einen Standort in der Karte auszuwählen. Die native Karte verfügt über eine "Drop-Pin" -Funktion, wo Sie etwas finden können, indem Sie einen Pin fallen lassen. Wie kann ich dies in MapKit tun?Wie kann ich eine PIN mit MapKit löschen?

+0

Wenn Ich kann etwas mit meiner Antwort klären. Lass es mich wissen, bitte. – RedBlueThing

+0

Als dies geschrieben wurde, gab es mindestens zwei gute Antworten zur Auswahl. Treffen Sie Ihre Wahl. – JugsteR

Antwort

27

Sie benötigen ein Objekt erstellen, das das MKAnnotation-Protokoll implementiert und fügen Sie dann dieses Objekt an die MKMapView:

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

Ihren Delegatobjekt instanziiert und es zu einer Karte hinzufügen:

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

Die Karte greift auf die Koordinateneigenschaft auf Ihrem AnnotationDelegate zu, um herauszufinden, wo der Pin auf der Karte platziert werden soll.

Wenn Sie Ihren Anmerkungsansicht anpassen möchten, müssen Sie die MKMapViewDelegateviewForAnnotation Methode auf Ihrer Karte-View-Controller implementieren:

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

Wenn Sie den Stift ziehen Funktionalität implementieren möchten Sie können Lesen Sie über die Handhabung von Annotation-Touch-Ereignissen im Apple OS Reference Library.

Sie können auch this article auf ziehen Drop mit mapkit, die auf eine funktionierende Sample-Bibliothek auf GitHub verweist. Sie können die Koordinaten der gezogenen Anmerkung abrufen, indem Sie das Element _koordinaten auf dem Objekt DDAnnotation überprüfen.

+0

Es gibt eine gute Blog-Post und Beispielcode für die Anmerkung Drag Drop hier: http://hollowout.blogspot.com/2009/07/mapkit-annotation-drag-and-drop-with.html – RedBlueThing

+0

Die Sache ist, selbst wenn Sie ziehen können, könntest du die Position des Pins nach dem Ziehen herausfinden? – erotsppa

+0

Ich habe meine Antwort mit ein wenig mehr Details auf dem Drag Drop Zeug aktualisiert. – RedBlueThing

23

Es gibt mehrere Möglichkeiten, eine PIN zu löschen, und Sie geben nicht an, wie Sie dies in Ihrer Frage tun sollen. Der erste Weg besteht darin, dies programmatisch zu tun. Dafür können Sie das verwenden, was RedBlueThing geschrieben hat, außer dass Sie keine benutzerdefinierte Klasse benötigen (abhängig davon, welche Version von iOS Sie als Ziel haben). Für iOS 4.0 und höher können Sie dieses Snippet verwenden, um programm eine Stecknadel fallen:

// 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]; 

Wenn Sie einen Stift fallen zu lassen, beispielsweise durch langes Drücken auf dem tatsächlichen mapView in der Lage sein wollen, können es wie folgt geschehen:

// 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]; 
} 

Wenn Sie alle Anmerkungen aufzählen möchten, verwenden Sie einfach den Code in beiden Schnipsel. So protokollieren Sie Positionen für alle Anmerkungen:

+0

diese Frage beantwortet was @erotspappa gefragt – JProgrammer

2

Möglicherweise müssen Sie auch MapView Delegate festlegen.

[mkMapView setDelegate:self]; 

Dann seine Delegierten nennen, 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

Sie Standort berührt bekommen können, jcesarmobile Antwort auf coordinates with iphone mapkit erhalten angezapft und Sie können jede Stecknadel wo als Gebrüll

// 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]; 
Verwandte Themen