How to open call out MKAnnotationView programmatically? (iPhone, MapKit)

20,311

Solution 1

In your mapViewController create an action method:

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

}

You can then determine the closest annotation based on current location and walking the annotations available in the array.

[mv annotations];

Once the closest annotation is calculated, call:

[self openAnnotation:closestAnnotation];

The mapView should scroll automatically to place your annotation in the center of the display area.

Solution 2

In swift 3 this is updated to:

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

and can be called using any annotation (this will open the annotation callout view and attempt to center the annotation on the map)

For example using the second annotation in a hypothetical list of annotations.

openAnnotation(annotation: mapView.annotations[1])
Share:
20,311

Related videos on Youtube

e75deaf2-fb2a-43e0-91ba-6caad0
Author by

e75deaf2-fb2a-43e0-91ba-6caad0

Updated on July 09, 2022

Comments

  • e75deaf2-fb2a-43e0-91ba-6caad0
    e75deaf2-fb2a-43e0-91ba-6caad0 almost 2 years

    I want to open up the callout for an MKPinAnnotationView programmatically. Eg I drop 10 pins on the map, and want to open up the one closest to me. How would I go about doing this?

    Apple has specified the 'selected' parameter for MKAnnotationView's, but discourages setting it directly (this doesn't work, tried it).

    For the rest MKAnnotationView only has a setHighlighted (same story), and can ShowCallout method..

    Any hints if this is possible at all?

  • Chip Coons
    Chip Coons almost 12 years
    Thanks Nate, for fixing the typo.
  • John Erck
    John Erck over 10 years
    If you know the annotation you want to programmatically select will be in the map view's visible area you can use [mv annotationsInMapRect:mv.visibleMapRect]. If you're working with large sets of map annotations this will provide a step up in performance.
  • Chip Coons
    Chip Coons over 10 years
    True. The MapKit API has expanded since this answer was originally provided. The annotationsInMapRect: was added in iOS 4.2.
  • Code Different
    Code Different about 6 years
    Your code is a strange mix of ObjC (the square brackets) and Swift. Why create an array then discard it?