在mapkit中显示自定义注释

时间:2017-02-04 20:27:39

标签: ios swift3 mkmapview mapkit mkmapitem

我试图在mapkit上显示图片注释而不是图钉注释。我使用此代码:

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!
}

我认为此方法不会调用viewForAnnotation,但我将代理连接到viewcontroller : mapView.delegate = self

我仍然在地图上看到了针脚注释而不是custominnotation

Map

1 个答案:

答案 0 :(得分:0)

现在实现此代码时:

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

    }

我可以看到这样的两个图像注释:

enter image description here

现在我想将此图像包含在用户位置中,我尝试使用此代码但仍然看到红色图钉注释而不是图像

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

            }

如何用用户位置显示汽车图像