2010-02-03 12 views
26

Ich möchte das Callout für eine programmgesteuert öffnen. ZB lasse ich 10 Pins auf der Karte fallen und möchte den nächsten öffnen. Wie würde ich das machen?Wie Aufruf MKAnnotationView programmgesteuert öffnen? (iPhone, MapKit)

Apple hat den Parameter 'selected' für MKAnnotationView's angegeben, rät jedoch davon ab, ihn direkt einzustellen (das funktioniert nicht, habe es versucht).

Für den Rest MKAnnotationView hat nur eine setHighlighted (gleiche Geschichte) und kann ShowCallout Methode ..

Irgendwelche Hinweise, wenn dies überhaupt möglich ist?

Antwort

76

In Ihrem mapViewController eine Aktion Methode erstellen:

- (void)openAnnotation:(id)annotation 
{ 
    //mv is the mapView 
    [mv selectAnnotation:annotation animated:YES]; 

} 

Sie dann die nächste Anmerkung basierend auf aktuellen Standort bestimmen können und die Anmerkungen in dem Array zu Fuß.

[mv annotations]; 

Sobald die nächste Anmerkung berechnet wird, rufen:

[self openAnnotation:closestAnnotation]; 

Die mapView sollte automatisch bewegen Ihre Anmerkung in der Mitte des Anzeigebereichs zu platzieren.

+0

Danke Nate, für die Befestigung des Tippfehlers. –

+0

Das ist genialer Typ .. –

+1

Wenn Sie wissen, dass die Annotation, die Sie programmgesteuert auswählen möchten, im sichtbaren Bereich der Kartenansicht liegt, können Sie 'mv annotationsInMapRect: mv.visibleMapRect]' verwenden. Wenn Sie mit großen Kartenanmerkungen arbeiten, wird dadurch die Leistung gesteigert. –

1

In swift 3 wird diese aktualisiert:

func openAnnotation(annotation: MkAnnotation) { 
_ = [mapView .selectAnnotation(annotation, animated: true)] 
} 

und kann mit jeder Anmerkung aufgerufen werden (dies wird die Anmerkung callout Ansicht öffnen und versuchen, die Anmerkung auf der Karte zu zentrieren)

Zum Beispiel Verwenden der zweiten Anmerkung in einer hypothetischen Liste von Anmerkungen.

openAnnotation(annotation: mapView.annotations[1]) 
+0

Ihr Code ist eine seltsame Mischung aus ObjC (die eckigen Klammern) und Swift. Warum ein Array erstellen und dann verwerfen? –