mkmapview - current - mapkit swift 4
Swift-Agregar MKAnnotationView To MKMapView (3)
1- la vista de su mapa debe delegarse en su controlador de vista 2- debe implementar
func mapView(aMapView: MKMapView!, viewForAnnotation annotation: CustomMapPinAnnotation!) -> MKAnnotationView!
esta función se llama desde cada anotación agregada a su Mapa
3- Subclasifique sus anotaciones para identificarlas en el método viewForAnnotation
4- en viewForAnnotation, agregar
if annotation.isKindOfClass(CustomMapPinAnnotation)
{
// change the image here
var pinView = aMapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? YourSubclassedAnnotation
pinView!.image = UIImage(contentsOfFile: "xyz")
}
Estoy tratando de agregar MKAnnotationView
a MKMapView
pero no puedo hacerlo ... ¿Alguien me puede ayudar?
Aquí está mi código:
override func viewDidLoad() {
super.viewDidLoad()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
var latitude:CLLocationDegrees = locationManager.location.coordinate.latitude
var longitude:CLLocationDegrees = locationManager.location.coordinate.longitude
var homeLati: CLLocationDegrees = 40.01540192
var homeLong: CLLocationDegrees = 20.87901079
var latDelta:CLLocationDegrees = 0.01
var longDelta:CLLocationDegrees = 0.01
var theSpan:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta)
var myHome:CLLocationCoordinate2D = CLLocationCoordinate2DMake(homeLati, homeLong)
var myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
var theRegion:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, theSpan)
self.theMapView.setRegion(theRegion, animated: true)
self.theMapView.mapType = MKMapType.Hybrid
self.theMapView.showsUserLocation = true
///Red Pin
var myHomePin = MKPointAnnotation()
myHomePin.coordinate = myHome
myHomePin.title = "Home"
myHomePin.subtitle = "Bogdan''s home"
self.theMapView.addAnnotation(myHomePin)
var anView:MKAnnotationView = MKAnnotationView()
anView.annotation = myHomePin
anView.image = UIImage(named:"xaxas")
anView.canShowCallout = true
anView.enabled = true
}
Debe mostrar la anotación, luego debe agregar el método de anotación de presentación:
let annotation = MKPointAnnotation()
mapVew.showAnnotations([annotation], animated: true)
annotation
es una instancia de MKPointAnnotation
.
viewForAnnotation
implementar el método de delegado viewForAnnotation
y devolver un MKAnnotationView
desde allí.
Aquí hay un ejemplo:
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
if (annotation is MKUserLocation) {
//if annotation is not an MKPointAnnotation (eg. MKUserLocation),
//return nil so map draws default view for it (eg. blue dot)...
return nil
}
let reuseId = "test"
var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
if anView == nil {
anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView.image = UIImage(named:"xaxas")
anView.canShowCallout = true
}
else {
//we are re-using a view, update its annotation reference...
anView.annotation = annotation
}
return anView
}
Recuerde que debe crear un MKAnnotationView
simple cuando desee utilizar su propia imagen personalizada. El MKPinAnnotationView
solo debe usarse para las anotaciones de pin estándar.
También tenga en cuenta que no debe intentar acceder a locationManager.location
inmediatamente después de llamar a startUpdatingLocation
. Puede que todavía no esté listo.
Utilice el método delegado didUpdateLocations
.
También debe llamar a requestAlwaysAuthorization
/ requestWhenInUseAuthorization
(consulte Servicios de ubicación que no funcionan en iOS 8 ).