2015-09-15 15 views
14

Dopo aver visto WWDC video 206 ho pensato che sarebbe stato un compito banale aggiungere la vista di dettaglio del richiamo a una vista di annotazione mapView.MapKit iOS 9 detailCalloutAccessoryUtilizzo di visualizzazione

Quindi, presumo che sto facendo qualcosa di sbagliato.

Con la mia vista pin istituito

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 
} 

ho solo questo

enter image description here

So che la vista sta funzionando, perché se provo con la leftCalloutAccessoryView ottengo enter image description here

Mi manca qualcosa. Nota, se ho appena aggiungere un'immagine al detailCalloutAccessoryView come

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

L'immagine è lì, dimensioni correttamente ecc

non riesco proprio a capire come mettere nel mio visualizzazione personalizzata.

Grazie

risposta

14

È necessario aggiungere alcuni vincoli per la larghezza e l'altezza della vista:

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

Aggiunta di un intrinsicContentSize funziona anche.

Ho eseguito alcune prove e ho scoperto che MapKit imposta automaticamente translatesAutoresizingMaskIntoConstraints su falso, quando si imposta una vista su detailCalloutAccessoryView.

Nella sessione WWDC 2015 "What's New in MapKit" è stato detto che "il layout automatico è supportato". Suppongo che Apple significhi davvero, che devi usare il layout automatico ?!

+0

sì, è bello, bel lavoro. – DogCoffee

+3

Come si elimina la spaziatura aggiunta a 'detailCalloutAccessoryView'? @Klaas – ScottOBot

+0

@ScottOBot non l'ha mai provato. Ma potrebbe essere possibile utilizzando i vincoli .Top, .Left, .Bottom e .Right anziché .Width e .Height? – Klaas

0

Usa UIImageView

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

Rendendolo funzionare con un'immagine e la visualizzazione dell'immagine va bene. Voglio usare una vista personalizzata. – DogCoffee

8

1. Creare un UIView e aggiungerlo alla vostra mappe VC nella Storyboard

enter image description here

Qui è possibile impostare la dimensione , i vincoli, aggiungere pulsanti, immagini, ecc - layout come vuoi. Le viste dello stack funzionano perfettamente in questo caso.

2. Creare e di uscita per il vostro Maps VC

controllo di trascinamento, come al solito, dalla visualizzazione personalizzata.

@IBOutlet var customDetailView: UIView! 

3. Impostare la detailCalloutAccessoryView per il vostro pin

Per esempio

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

Successo

enter image description here

+2

Questo potrebbe sembrare ovvio ma mi ha catturato per qualche minuto ... Cercare di trascinare l'UIView in uno spazio aperto nello storyboard non funziona. Devi trascinarlo sulla barra in alto sopra il UIViewController in cui desideri utilizzarlo. Come accanto a quel cerchio giallo, riquadro rosso, ecc ... –

+1

@ByronCoetsee, è grandioso, probabilmente grande come la risposta. Mi chiedo perché diavolo Apple fa questo tipo di caratteristiche easter-egg? – Eduardo

+0

Fantastico! Mi chiedevo come posso personalizzarlo ... Mettere un pulsante e farlo fare un po 'di azione, e le etichette personalizzate con testo dinamico ... Puoi dare qualche idea? Grazie! – Cleversou