2015-09-15 19 views
14

Po obejrzeniu WWDC video 206 założyłem, że byłoby to banalne zadanie polegające na dodaniu widoku szczegółów objaśnień do widoku mapView adnotacji.MapKit iOS 9 detailCalloutAccessoryView use

Zakładam więc, że robię coś nie tak.

Z moim pin widzenia skonfigurować

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 
} 

ja tylko dostać ten

enter image description here

Znam widok działa, ponieważ gdy próbuję go z leftCalloutAccessoryView uzyskać enter image description here

Pewnie czegoś brakuje. Uwaga, jeśli po prostu dodać zdjęcie do detailCalloutAccessoryView jak

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

obraz jest tam, rozmiar poprawnie itp

po prostu nie mogę dowiedzieć się, jak umieścić w moim widoku niestandardowego.

Dzięki

Odpowiedz

14

Trzeba dodać pewne ograniczenia dla szerokości i wysokości widoku:

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

dodanie intrinsicContentSize również działa.

Zrobiłem kilka testów i okazało się, że MapKit automagicznie ustawia translatesAutoresizingMaskIntoConstraints na wartość false, gdy ustawiasz widok na detailCalloutAccessoryView.

W sesji WWDC 2015 "What's New in MapKit" powiedziano, że "układ automatyczny jest obsługiwany". Uważam, że Apple naprawdę oznacza, że ​​musisz użyć automatycznego układu ?!

+0

Tak, to jest dobra robota. – DogCoffee

+3

Jak pozbyć się odstępów dodanych wokół 'detailCalloutAccessoryView'? @Klaas – ScottOBot

+0

@ScottOBot nigdy tego nie próbowałem. Ale może być to możliwe, używając ograniczeń .Top, .Left, .Bottom i .Right zamiast .Width i .Height? – Klaas

0

Zastosowanie UIImageView

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

Praca z obrazem i widokiem obrazu jest w porządku. Chcę użyć niestandardowego widoku. – DogCoffee

8

1. Utwórz UIView i dodać go do Twojej mapy VC w Planie

enter image description here

Tutaj można ustawić rozmiar , wiązania, dodawać przyciski, obrazy, itp - układ, jak chcesz. Widoki stosu działają idealnie w tym przypadku.

2. Tworzenie i wylot do mapy VC

sterowania przeciągnij jak zwykle, od widoku niestandardowego.

@IBOutlet var customDetailView: UIView! 

3. Ustaw detailCalloutAccessoryView za kołkiem

Na przykład

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

Sukces

enter image description here

+2

To może wydawać się oczywiste, ale przykuło mnie to na kilka minut ... Próba przeciągnięcia UIView na otwartą przestrzeń w scenorysie nie działa. Musisz przeciągnąć go na górny pasek nad UIViewControllerem, w którym chcesz go użyć. Jak obok żółtego kółka, czerwonego pudełka itp. –

+1

@ByronCoetsee, to świetnie, prawdopodobnie tak dobrze jak odpowiedź. Zastanawiam się, dlaczego, do cholery, Apple robi tego rodzaju funkcje z jajek wielkanocnych? – Eduardo

+0

Awesome! Zastanawiam się, jak mogę go spersonalizować ... Wystarczy nacisnąć przycisk i zrobić kilka akcji, a niestandardowe etykiety z dynamicznym tekstem ... Czy możesz dać jakiś pomysł? Dzięki! – Cleversou