MapKit iOS 9 detailCalloutAccessoryView usage MapKit iOS 9 detailCalloutAccessoryView usage ios ios

MapKit iOS 9 detailCalloutAccessoryView usage


You have to add some constraints for width and height of your view:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {    var av = mapView.dequeueReusableAnnotationViewWithIdentifier("id")    if av == nil {        av = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "id")    }    let myView = UIView()    myView.backgroundColor = .greenColor()    let widthConstraint = NSLayoutConstraint(item: myView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40)    myView.addConstraint(widthConstraint)    let heightConstraint = NSLayoutConstraint(item: myView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 20)    myView.addConstraint(heightConstraint)    av!.detailCalloutAccessoryView = myView    av!.canShowCallout = true    return av!}

Munich 1972

Adding an intrinsicContentSize also works.

I did some testing and found out, that MapKit automagically sets translatesAutoresizingMaskIntoConstraints to false, when you set a view to detailCalloutAccessoryView.

In the WWDC 2015 session "What's New in MapKit" it was told, that "auto layout is supported". I reckon that Apple really means, that you have to use auto layout?!


1. Create a UIView and add it to yours maps VC in the Storyboard

enter image description here

Here you can set the size, constraints, add buttons, images, etc - layout how you want. Stack views work perfect in this instance.

2. Create and outlet to your Maps VC

Control drag as per usual, from your custom view.

@IBOutlet var customDetailView: UIView!

3. Set the detailCalloutAccessoryView for your pin

For example

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {    view.detailCalloutAccessoryView = customDetailView}

Success

enter image description here


Use UIImageView

view.detailCalloutAccessoryView = UIImageView(image:UIImage(named:"YourImageName"))