web-dev-qa-db-fra.com

Swift - Ajouter MKAnnotationView à MKMapView

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
}
22
Bogdan Bogdanov

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

35
user467105

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")
}
0
user3766852

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.

0
Abhishek Mishra