2015-09-15 14 views
14

Nach dem Anschauen WWDC video 206 nahm ich an, dies wäre eine triviale Aufgabe des Hinzufügens der Detail-Callout-Ansicht zu einer mapView Annotation-Ansicht.MapKit iOS 9 detailCalloutAccessoryView Verwendung

Also, ich nehme an, dass ich etwas falsch mache.

Mit meinem Stift Ansicht einrichten

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

    let view:MKAnnotationView! 

    if let dequed = routeMapView.dequeueReusableAnnotationViewWithIdentifier("pin") { 
     view = dequed 
    } 
    else { 
     view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin") 
    } 

    let x = UIView(frame: CGRectMake(0, 0, 200, 200)) 
    x.backgroundColor = UIColor.redColor() 

    // shows the red 
    //view.leftCalloutAccessoryView = x 

    // working as no subtitle - but no red view 
    view.detailCalloutAccessoryView = x 

    view.canShowCallout = true 
    return view 
} 

ich diese nur bekommen

enter image description here

ich die Ansicht wissen funktioniert, denn wenn ich es mit dem leftCalloutAccessoryView versuche ich enter image description here

bekommen

Ich muss etwas verpassen. Beachten Sie, wenn ich ein Bild fügen Sie einfach auf die detailCalloutAccessoryView wie

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

Das Bild besteht, Größe richtig etc

Ich kann einfach nicht herausfinden, wie in meiner eigenen benutzerdefinierten Ansicht zu setzen.

Dank

Antwort

14

Sie haben einige Einschränkungen für die Breite und Höhe Ihrer Ansicht hinzuzufügen:

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

ein intrinsicContentSize auch Hinzufügen funktioniert.

ich einige Tests gemacht und herausgefunden, dass MapKit setzt automagically translatesAutoresizingMaskIntoConstraints auf false, wenn Sie einen Blick auf detailCalloutAccessoryView gesetzt.

In der WWDC 2015 Sitzung "What's New in MapKit" wurde gesagt, dass "Auto-Layout wird unterstützt". Ich denke, dass Apple wirklich bedeutet, dass Sie Auto-Layout verwenden müssen ?!

+0

ja das ist es, schöne Arbeit. – DogCoffee

+3

Wie entfernen Sie den Abstand, der um die 'detailCalloutAccessoryView' hinzugefügt wurde? @Klaas – ScottOBot

+0

@ScottOBot hat das nie versucht. Aber es könnte möglich sein, indem .Top, .Left, .Bottom und .Right-Constraints anstelle von .Width und .Height? – Klaas

0

Verwenden UIImageView

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

Die Arbeit mit einer Bild- und Bildansicht ist in Ordnung. Ich möchte eine benutzerdefinierte Ansicht verwenden. – DogCoffee

8

1. eine UIView erstellen und fügen Sie es zu Ihrem VC-Karten im Storyboard

enter image description here

Hier können Sie die Größe festlegen , Einschränkungen, fügen Sie Schaltflächen, Bilder usw. - Layout, wie Sie wollen. Stapelansichten funktionieren in diesem Fall perfekt.

2. Erstellen und Auslass auf Ihre Karten VC

Steuer ziehen wie üblich, aus Ihrer benutzerdefinierten Ansicht.

@IBOutlet var customDetailView: UIView! 

3. Stellen Sie den detailCalloutAccessoryView für Ihren Stift

Zum Beispiel

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

Erfolg

enter image description here

+2

Das mag offensichtlich erscheinen, aber es hat mich ein paar Minuten lang erwischt ... Der Versuch, die UIView im Storyboard in den offenen Raum zu ziehen, funktioniert nicht. Sie müssen es auf die obere Leiste über dem UIViewController ziehen, in dem Sie es verwenden möchten. Wie neben dem gelben Kreis, rote Box usw. –

+1

@ByronCoetsee, das ist großartig, wahrscheinlich so groß wie die Antwort. Ich frage mich, warum zum Teufel Apple diese Art von Osterei Features hat? – Eduardo

+0

Super! Ich frage mich, wie kann ich es personalisieren ... Setzen Sie einen Knopf und machen Sie es etwas Aktion und benutzerdefinierte Etiketten mit dynamischen Text ... Können Sie eine Idee geben? Vielen Dank! – Cleversou