J'essaie d'ajouter MKAnnotationView
à MKMapView
mais je ne peux pas le faire… Quelqu'un peut-il m'aider?
Voici mon code:
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
}
Vous devez implémenter la méthode déléguée viewForAnnotation
et renvoyer une variable MKAnnotationView
à partir de là.
Voici un exemple:
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
}
N'oubliez pas que vous devez créer une plainMKAnnotationView
lorsque vous souhaitez utiliser votre propre image personnalisée. La MKPinAnnotationView
ne doit être utilisée que pour les annotations de broches standard.
Notez également que vous ne devez pas essayer d'accéder à locationManager.location
immédiatement après avoir appelé startUpdatingLocation
. Ce n'est peut-être pas encore prêt.
Utilisez la méthode de délégué didUpdateLocations
.
Vous devez également appeler requestAlwaysAuthorization
/requestWhenInUseAuthorization
(voir Les services de localisation ne fonctionnent pas sous iOS 8 ).
1- votre vue de carte doit se déléguer à votre contrôleur de vue 2- vous devez implémenter
func mapView(aMapView: MKMapView!, viewForAnnotation annotation: CustomMapPinAnnotation!) -> MKAnnotationView!
cette fonction est appelée depuis chaque annotation ajoutée à votre carte
3- sous-classez vos annotations pour les identifier dans la méthode viewForAnnotation
4- dans viewForAnnotation, ajoutez
if annotation.isKindOfClass(CustomMapPinAnnotation)
{
// change the image here
var pinView = aMapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? YourSubclassedAnnotation
pinView!.image = UIImage(contentsOfFile: "xyz")
}
Vous devez afficher les annotations, puis ajouter la méthode show annotation:
let annotation = MKPointAnnotation()
mapVew.showAnnotations([annotation], animated: true)
annotation
est une instance de MKPointAnnotation
.