apple ios mapkit mkannotationview

apple - MapKit iOS 9 detalleCalloutAccessoryView uso



mapkit apple (4)

Puede usar una clase personalizada y anular intrinsicContentSize para dimensionar dinámicamente la vista de detalle dependiendo de su contenido para niños. (como lo insinuó @Klaas en la respuesta aceptada )

Esto puede ser especialmente útil si el tamaño de su vista no se conoce de antemano o si cambia durante el tiempo de ejecución o simplemente no desea agregar restricciones mediante programación.

Aquí hay un ejemplo que usa dos etiquetas que están dentro de una vista de pila. El intrinsicContentSize se establece para igualar el tamaño que tomaría la vista de pila. La configuración de una instancia de lo siguiente como detailAccessoryView debería proporcionarle una vista que reacciona para cambiar el texto de las etiquetas y no necesita restricciones agregadas mediante programación.

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() } }

Después de ver el video 206 de la WWDC , asumí que esto sería una tarea trivial de agregar la vista de llamada detallada a la vista de anotación mapView.

Entonces, asumo que estoy haciendo algo mal.

Con mi vista de pin configurada

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 }

Solo consigo esto

Sé que la vista está funcionando, porque si lo intento con el leftCalloutAccessoryView obtengo

Debo estar perdiendo algo. Tenga en cuenta que si simplemente agrego una imagen al detailCalloutAccessoryView como

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

La imagen está ahí, tamaño correctamente, etc.

Simplemente no puedo entender cómo poner en mi propia vista personalizada.

Gracias


Tienes que agregar algunas restricciones para el ancho y alto de tu 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! }

Agregar un intrinsicContentSize también funciona.

Hice algunas pruebas y descubrí que MapKit establece automáticamente que se traduce TranslatesAutoresizingMaskIntoConstraints en false, cuando configura una vista para detailCalloutAccessoryView .

En la sesión WWDC 2015 "Lo nuevo en MapKit" se dijo que "se admite el diseño automático". ¿Creo que Apple realmente quiere decir que tienes que usar el diseño automático?


Usa UIImageView

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


1. Cree un UIView y agréguelo a sus mapas VC en el Storyboard

Aquí puede configurar el tamaño, las restricciones, agregar botones, imágenes, etc. Las vistas de pila funcionan perfectamente en este caso.

2. Creación y salida a tus Mapas VC.

Control de arrastre como de costumbre, desde su vista personalizada.

@IBOutlet var customDetailView: UIView!

3. Establezca el detailCalloutAccessoryView para su pin

Por ejemplo

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

Éxito