Stuck on using MKPinAnnotationView() within Swift and MapKit
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
}
Kokanee
Updated on June 04, 2022Comments
-
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 almost 10 yearsBrilliant - 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 over 9 years@Anna, did you have an example project available? I'm banging my head against the wall here. Thanks
-
Lunarchaos42 about 8 yearsI 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()