2015-03-18 14 views
7

Sto cercando di cambiare l'immagine pin su MKMapView in Swift, ma sfortunatamente non funziona. Qualche idea su cosa sto facendo male? Ho visto alcuni esempi qui, ma non ha funzionato.Cambia immagine pin su MKMapView in Swift

import UIKit 
import MapKit 

class AlarmMapViewController: UIViewController { 
    @IBOutlet weak var map: MKMapView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     showAlarms() 
     map.showsUserLocation = true 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func showAlarms(){ 

     map.region.center.latitude = 49 
     map.region.center.longitude = 12 
     map.region.span.latitudeDelta = 1 
     map.region.span.longitudeDelta = 1 

     for alarm in Alarms.sharedInstance.alarms { 

      let location = CLLocationCoordinate2D(
       latitude: Double(alarm.latitude), 
       longitude: Double(alarm.longtitude) 
      ) 

      let annotation = MKPointAnnotation() 
      annotation.setCoordinate(location) 
      annotation.title = alarm.name 
      annotation.subtitle = alarm.description 
      mapView(map, viewForAnnotation: annotation).annotation = annotation 
      map.addAnnotation(annotation) 
     } 
    } 

    @IBAction func zoomIn(sender: AnyObject) { 
    } 

    @IBAction func changeMapType(sender: AnyObject) { 
    } 

    func mapView(mapView: MKMapView!, 
     viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { 

     if annotation is MKUserLocation { 
      //return nil so map view draws "blue dot" for standard user location 
      return nil 
     } 

     let reuseId = "pin" 
     var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView 
     if pinView == nil { 
      pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
      pinView!.canShowCallout = true 
      pinView!.animatesDrop = true 
      pinView!.image = UIImage(named:"GreenDot")! 

     } 
     else { 
      pinView!.annotation = annotation 
     } 

     return pinView 
    } 
} 

L'immagine GreenDot è disponibile e utilizzata in altri luoghi.

risposta

17

Non dimenticare di impostare:

map.delegate = self 

e assicurarsi che il UIViewController implementa il protocollo MKMapViewDelegate.
Se si dimentica di eseguire questa operazione, l'implementazione di mapView:viewForAnnotation: non verrà invocata per la mappa.

Inoltre, sembra che pinView!.animatesDrop = true interrompa le immagini personalizzate. Dovresti impostarlo su false o utilizzare MKAnnotationView (che non ha una proprietà animatesDrop).

Vedere this related question se si desidera implementare un'animazione personalizzata.

+0

Ok ho fatto questo, ora posso cambiare pinColor con pinView! .pinColor = .Green, ma quando provo a cambiare immagine con pinView! .image = UIImage (named: "GrayDot")! questo ancora non funziona .. – maxxxo

+3

Hai provato a usare 'MKAnnotationView' invece di' MKPinAnnotationView'? – Para

+0

Ho appena fatto con MKAnnotationView – maxxxo

7

MKPinAnnotationView utilizza sempre un'immagine pin, non può essere everride. Devi invece usare MKAnnotationView. Attenzione perché la proprietà si animaDrop non è una proprietà di MKAnnotationView valida, Rem la linea.

Problemi correlati