syds
syds

Reputation: 322

MKMarkerAnnotationView not showing callout

I am currently working on creating callouts for annotations I have added to my mapview via MapKit. The annotations work out well but currently callouts aren't being displayed even though I am using the right code to enable them (I believe).

HERE is my viewFor annotation code block.

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    if annotation is MKUserLocation {
        return nil
    }

    if let annotation = annotation as? ClusterAnnotation {
        let identifier = "cluster"
        return mapView.annotationView(annotation: annotation, reuseIdentifier: identifier)
    } else {
        let identifier = "pin"

        let annotationView = mapView.annotationView(of: MKMarkerAnnotationView.self, annotation: annotation, reuseIdentifier: identifier)
        annotationView.isEnabled = true
        annotationView.canShowCallout = true
        annotationView.accessibilityLabel = "hi"
        annotationView.isHidden = false
        annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
        annotationView.markerTintColor = UIColor.customBlue()
        annotationView.glyphImage = UIImage(named: "person")
        return annotationView
    }
}

Extension code block for annotationView function.

extension MKMapView {
    func annotationView<T: MKAnnotationView>(of type: T.Type, annotation: MKAnnotation?, reuseIdentifier: String) -> T {
        guard let annotationView = dequeueReusableAnnotationView(withIdentifier: reuseIdentifier) as? T else {
            return type.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
        }
        annotationView.annotation = annotation
        return annotationView
    }
}

The annotation enlarges as I select it, and in the didSelect code block it runs the print statement I run through it. Not exactly sure what is going on that's not allowing the callout to show even though I've literally enabled just about everything.

Upvotes: 1

Views: 1189

Answers (2)

Waxhaw
Waxhaw

Reputation: 829

From the source code documentation:

    // If YES, a standard callout bubble will be shown when the annotation is selected.
// The annotation must have a title for the callout to be shown.
@property (nonatomic) BOOL canShowCallout;

Without the Title value being set the other items will not show up.

Upvotes: 0

Dixit Akabari
Dixit Akabari

Reputation: 2547

Please Used This Code. This code working fine for me. This Code support Swift4 and Swift5.

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    //  Don't want to show a custom image if the annotation is the user's location.
    if (annotation is MKUserLocation) {
        return nil
    } else {

        let annotationIdentifier = "AnnotationIdentifier"
        let nibName = "MyAnnotationView" //My XIB Name
        let viewFromNib = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)?.first as! MyAnnotationView // get My XIB
        var annotationView: MyAnnotationView?

        // if there is a view to be dequeued, use it for the annotation
        if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) as? MyAnnotationView {

            if dequeuedAnnotationView.subviews.isEmpty {
                dequeuedAnnotationView.addSubview(viewFromNib)
            }
            annotationView = dequeuedAnnotationView
            annotationView?.annotation = annotation
        } else {

            // if no views to dequeue, create an Annotation View
            let av = MyAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
            av.addSubview(viewFromNib)
            annotationView = av     // extend scope to be able to return at the end of the func
        }

        // after we manage to create or dequeue the av, configure it
        if let annotationView = annotationView {
            annotationView.canShowCallout = true                                    // callout bubble
            annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
            annotationView.frame = CGRect(x: 0, y: 0, width: 75, height: 80)

            let customView = annotationView.subviews.first as! MyAnnotationView
            customView.frame = annotationView.frame

        }
        return annotationView
    }
}

This Code OutPut :

enter image description here

Happy To Help You.

Upvotes: 2

Related Questions