Stuck on using MKPinAnnotationView() within Swift and MapKit

16,636

You need to implement the viewForAnnotation delegate method and return an MKAnnotationView (or subclass) from there.
This is just like in Objective-C -- the underlying SDK works the same way.

Remove the creation of MKPinAnnotationView from the for loop that adds the annotations and implement the delegate method instead.

Here is a sample implementation of the viewForAnnotation delegate method in Swift:

func mapView(mapView: MKMapView!, 
    viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

    if annotation is MKUserLocation {
        //return nil so map view draws "blue dot" for standard user location
        return nil
    }

    let reuseId = "pin"

    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
    if pinView == nil {
        pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pinView!.canShowCallout = true
        pinView!.animatesDrop = true
        pinView!.pinColor = .Purple
    }
    else {
        pinView!.annotation = annotation
    }

    return pinView
}
Share:
16,636
Kokanee
Author by

Kokanee

Updated on June 04, 2022

Comments

  • Kokanee
    Kokanee almost 2 years

    I have a working loop to setup annotations for the title and subtitle elements for some working data points. What I want to do within that same loop structure is to set the pin color to Purple instead of the default. What I can't figure out is what I need to do to tap into my theMapView to set the pin accordingly.

    My working loop and some attempts at something...

    ....
    for var index = 0; index < MySupplierData.count; ++index {
    
      // Establish an Annotation
      myAnnotation = MKPointAnnotation();
      ... establish the coordinate,title, subtitle properties - this all works
      self.theMapView.addAnnotation(myAnnotation)  // this works great.
    
      // In thinking about PinView and how to set it up I have this...
      myPinView = MKPinAnnotationView();      
      myPinView.animatesDrop = true;
      myPinView.pinColor = MKPinAnnotationColor.Purple;  
    
      // Now how do I get this view to be used for this particular Annotation in theMapView that I am iterating through??? Somehow I need to marry them or know how to replace these attributes directly without the above code for each data point added to the view
      // It would be nice to have some kind of addPinView.  
    
    }
    
  • Kokanee
    Kokanee almost 10 years
    Brilliant - Tks. I dropped this right in and it worked. I just needed to see a Swift equivalent as I don't do a lot of Obj C. One minor point in that the compiler threw a warning for using the underscore in the line: func mapView(_ mapView: MKMapView!,... The warning was "Extraneous "_" in paramter 'mapView' has no keyword argument name.
  • User4
    User4 over 9 years
    @Anna, did you have an example project available? I'm banging my head against the wall here. Thanks
  • Lunarchaos42
    Lunarchaos42 about 8 years
    I do not have enough rep to comment, but the function above still works except that pinView!.pinColor is not depreciated. It should read pinView!.pinTintColor = UIColor.purpleColor()