2017-02-04 5 views
0

Ich versuche, eine Bildannotation anstelle einer Pin-Annotation auf dem Mapkit anzuzeigen. Ich verwende diesen Code:benutzerdefinierte Annotation in Mapkit anzeigen

import UIKit 
import MapKit 

class ViewController2: UIViewController , MKMapViewDelegate { 

    @IBOutlet var mapView: MKMapView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     mapView.delegate = self 

     let coordinate = CLLocationCoordinate2DMake(26.889281, 75.836042) 

     let region = MKCoordinateRegion(center: coordinate, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)) 

     mapView.setRegion(region, animated: true) 



     var info1 = CustomPointAnnotation() 
     info1.coordinate = CLLocationCoordinate2DMake(26.889281, 75.836042) 
     info1.title = "Info1" 
     info1.subtitle = "Subtitle" 
     info1.imageName = "taxi" 

     var info2 = CustomPointAnnotation() 
     info2.coordinate = CLLocationCoordinate2DMake(26.862280, 75.815098) 
     info2.title = "Info2" 
     info2.subtitle = "Subtitle" 
     info2.imageName = "smile" 

     mapView.addAnnotation(info1) 
     mapView.addAnnotation(info2) 

     mapView.showAnnotations(mapView.annotations, animated: true) 
    } 

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

     print("delegate called") 

     if !(annotation is CustomPointAnnotation) { 
      return nil 
     } 

     let reuseId = "test" 

     var anView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) 
     if anView == nil { 
      anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
      anView?.canShowCallout = true 
     } 
     else { 
      anView?.annotation = annotation 
     } 

     //Set annotation-specific properties **AFTER** 
     //the view is dequeued or created... 

     let cpa = annotation as! CustomPointAnnotation 
     anView?.image = UIImage(named:cpa.imageName) 

     return anView 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewDidAppear(_ animated: Bool) { 

    } 


} 

class CustomPointAnnotation: MKPointAnnotation { 
    var imageName: String! 
} 

Ich denke, diese Methode nicht viewForAnnotation anruft, obwohl ich die Delegierten mit viewcontroller : mapView.delegate = self verbinden.

Ich sehe noch den Stift Anmerkung statt custominnotation auf der Karte:

Map

+0

Mögliches Duplikat zeigen kann [ iOS Swift MapKit Benutzerdefinierte Annotation] (http://stackoverflow.com/questions/38274115/ios-swift-mapkit-custom-annotation) –

+0

Wenn Sie mit dem Setzen von Knickpunkten und dem Verfolgen Ihres Codes vertraut sind, sehen Sie, wann der Code zu Ihnen kommt viewForAnnotation delegate übergibt das "if! (Anmerkung ist CustomPointAnnotation)" oder gibt es dort zurück. –

Antwort

0

jetzt, wenn Sie diesen Code implementieren:

import UIKit 
import MapKit 

class ViewController2: UIViewController , MKMapViewDelegate { 

    @IBOutlet var mapView: MKMapView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     mapView.delegate = self 

     let coordinate = CLLocationCoordinate2DMake(26.889281, 75.836042) 

     let region = MKCoordinateRegion(center: coordinate, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)) 

     mapView.setRegion(region, animated: true) 



     let annotation = MKPointAnnotation() 
     annotation.title = "Annotation Created" 
     annotation.subtitle = "mahdi" 
     annotation.coordinate = CLLocationCoordinate2DMake(26.889281, 75.836042) 

     let annotation2 = MKPointAnnotation() 
     annotation2.title = "Annotation Created" 
     annotation2.subtitle = "mahdi" 
     annotation2.coordinate = CLLocationCoordinate2DMake(26.862280, 75.815098) 



     mapView.addAnnotation(annotation) 
     mapView.addAnnotation(annotation2) 

    } 


    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 

     guard !annotation.isKind(of: MKUserLocation.self) else { 

      return nil 
     } 

     let annotationIdentifier = "AnnotationIdentifier" 

     var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) 

     if annotationView == nil { 
      annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) 
      annotationView!.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) 
      annotationView!.canShowCallout = true 
     } 
     else { 
      annotationView!.annotation = annotation 
     } 

     annotationView!.image = UIImage(named: "taxi") 

     return annotationView 

    } 

i die beiden Bilder Anmerkungen wie diese sehen:

enter image description here

jetzt mag ich mit Benutzerposition um dieses Bild schließen, versuche ich mit diesem Code aber immer noch die roten Stift Anmerkung statt Bild

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 


     if let location = manager.location?.coordinate { 

      userLocation = CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude) 

      // print(userLocation) 

      if driverOnTheWay == false { 

       let region = MKCoordinateRegion(center: userLocation, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)) 
       self.mapView.setRegion(region, animated: true) 
       self.mapView.removeAnnotations(self.mapView.annotations) 


       let annotation = MKPointAnnotation() 
       annotation.title = "مكانك هنا" 
       annotation.subtitle = "mahdi" 
       annotation.coordinate = userLocation 
       self.mapView.addAnnotation(annotation) 




      } 

      func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 

       guard !annotation.isKind(of: MKUserLocation.self) else { 

        return nil 
       } 

       let annotationIdentifier = "AnnotationIdentifier" 

       var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) 

       if annotationView == nil { 
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) 
        annotationView!.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) 
        annotationView!.canShowCallout = true 
       } 
       else { 
        annotationView!.annotation = annotation 
       } 

       annotationView!.image = UIImage(named: "car") 

       return annotationView 

      } 

sehen, wie Auto Bild mit Benutzerstandort

Verwandte Themen