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