Подробности MapKit iOS 9CalloutAccessoryПросмотр использования

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

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

С моим настроенным просмотром булавки

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")

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

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

Спасибо


person DogCoffee    schedule 15.09.2015    source источник


Ответы (4)


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

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 действительно имеет в виду, что вы должны использовать автоматическую раскладку?!

person Klaas    schedule 01.10.2015
comment
Как избавиться от пробела, добавленного вокруг detailCalloutAccessoryView? @Клаас - person ScottOBot; 11.11.2015
comment
@ScottOBot никогда не пробовал этого. Но это возможно, используя ограничения .Top, .Left, .Bottom и .Right вместо .Width и .Height? - person Klaas; 11.11.2015
comment
@Klaas Если бы вы использовали ограничения .Top, .Left, .Bottom и .Right, разве вам не понадобилась бы ссылка на заголовок и другие элементы внутри выноски? Как вы получаете это при создании detailCalloutAccessoryView? - person ScottOBot; 11.11.2015
comment
что автоматическая компоновка поддерживается. Я считаю, что Apple действительно имеет в виду, что вы должны использовать автоматическую раскладку! -- Типично :) - person Manav; 19.04.2019

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

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

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

<сильный>2. Создание и выход в ВК Google Maps

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

@IBOutlet var customDetailView: UIView!

<сильный>3. Установите для своего пин-кода detailCalloutAccessoryView

Например

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

Успех

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

person DogCoffee    schedule 23.09.2015
comment
Это может показаться очевидным, но это застало меня врасплох на несколько минут... Попытка перетащить UIView в открытое пространство в раскадровке не работает. Вам нужно перетащить его на верхнюю панель над UIViewController, в котором вы хотите его использовать. Например, рядом с желтым кружком, красным полем и т. Д. - person Byron Coetsee; 19.05.2016
comment
@ByronCoetsee, это здорово, наверное, так же здорово, как и ответ. Интересно, какого черта Apple делает такие пасхальные яйца? - person Eduardo; 13.06.2016
comment
Потрясающий! Мне было интересно, как я могу его персонализировать... Поместите кнопку и заставьте ее выполнять какое-то действие, а также настраиваемые метки с динамическим текстом... Можете ли вы дать какую-нибудь идею? Спасибо! - person Cleversou; 01.12.2017

Используйте UIImageView

view.detailCalloutAccessoryView = UIImageView(image:UIImage(named:"YourImageName")) 
person user2643679    schedule 20.09.2015
comment
Заставить его работать с изображением и изображением в порядке. Я хочу использовать настраиваемый вид. - person DogCoffee; 21.09.2015

Вы можете использовать пользовательский класс и переопределить intrinsicContentSize для динамического изменения размера подробного представления в зависимости от его дочернего содержимого. (как намекнул @Klaas в принятом ответе)

Это может быть особенно полезно, если размер вашего представления заранее неизвестен или изменяется во время выполнения, или вы просто не хотите программно добавлять ограничения.

Вот пример использования двух меток, которые находятся внутри представления стека. intrinsicContentSize устанавливается равным размеру представления стека. Установка следующего экземпляра в качестве detailAccessoryView должна дать вам представление, которое реагирует на изменение текста меток и не нуждается в программно добавленных ограничениях.

class CustomCalloutDetailView : UIView {

    @IBOutlet weak var label1: UILabel!

    @IBOutlet weak var label2: UILabel!

    @IBOutlet weak var mainStack: UIStackView!

    override var intrinsicContentSize: CGSize {
        get {
            return mainStack.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
        }
    }

    public func setLabel1(_ labelText: String) {
        self.label1.text = labelText
        self.invalidateIntrinsicContentSize()
    }
}
person vlz    schedule 25.07.2018