Search code examples
iosswiftmkannotationmkpinannotationview

Swift - MKPinAnnotation image issue


I'm trying to change my pin annotation image to something other than the pin.

    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 = .Green
            pinView!.image = UIImage(named: "icon1.png")

            // Add image to left callout
            var mugIconView = UIImageView(image: UIImage(named: "test.png"))
            pinView!.leftCalloutAccessoryView = mugIconView

            // Add detail button to right callout
            var calloutButton = UIButton.buttonWithType(.DetailDisclosure) as UIButton
            pinView!.rightCalloutAccessoryView = calloutButton
        }
        else {
            pinView!.annotation = annotation
        }

        return pinView

Everything works except changing the pin image. I have a custom point annotation subclass which is this

I've been searching for hours but every other SO question I've found hasn't helped. I'd appreciate any help... thanks.

UPDATED WITH ANSWER

   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
    }

    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier("pin")

    if pinView == nil {
        pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: "pin")
        pinView!.canShowCallout = true
        pinView!.image = UIImage(named: "test.png")

        // Add image to left callout
        var mugIconView = UIImageView(image: UIImage(named: "test.png"))
        pinView!.leftCalloutAccessoryView = mugIconView

        // Add detail button to right callout
        var calloutButton = UIButton.buttonWithType(.DetailDisclosure) as UIButton
        pinView!.rightCalloutAccessoryView = calloutButton
    }
    else {
        pinView!.annotation = annotation
    }

    return pinView
}

Solution

  • You want MKAnnotationView, not MKPinAnnotationView. Pin annotations can't customize their image.

    See this SO answer for additional details