MapKit iOS 9 detailCalloutAccessoryView использование

После просмотра WWDC video 206 Я предположил, что было бы тривиальной задачей добавления вида выносок детали в представление аннотации mapView.

Итак, я предполагаю, что Im делает что-то неправильно.

С настройкой моего булавки

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
}

Я получаю только этот

введите описание изображения здесь

Я знаю, что представление работает, потому что если я попробую его с leftCalloutAccessoryView, я получу введите описание изображения здесь

Мне что-то не хватает. Обратите внимание, что если я просто добавлю изображение в detailCalloutAccessoryView как

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

Изображение есть, размер правильно и т.д.

Я просто не могу понять, как добавить свой собственный пользовательский вид.

Спасибо

Ответы

Ответ 1

Вы должны добавить некоторые ограничения для ширины и высоты вашего представления:

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!
}

Мюнхен 1972

Также работает intrinsicContentSize.

Я провел некоторое тестирование и выяснил, что MapKit автоматически устанавливает translatesAutoresizingMaskIntoConstraints на false, когда вы устанавливаете представление на detailCalloutAccessoryView.

На сессии WWDC 2015 "Что нового в MapKit" было сказано, что поддерживается "автомакет". Я полагаю, что Apple действительно означает, что вам нужно использовать автоматический макет?!

Ответ 2

1. Создайте UIView и добавьте его в свои карты VC в раскадровке

введите описание изображения здесь

Здесь вы можете установить размер, ограничения, добавить кнопки, изображения и т.д. - макет, как вы хотите. Представления стека отлично работают в этом случае.

2. Создание и выход на ваши карты VC

Управляйте перетаскиванием в соответствии с обычным, с вашего пользовательского представления.

@IBOutlet var customDetailView: UIView!

3. Установите detailCalloutAccessoryView для вашего вывода

Например

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

Успех

введите описание изображения здесь

Ответ 3

Использовать UIImageView

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