Swift MapKitのマーカーカラーを外部からのステータスによって変更する


概要

MapKit Annotationのマーカーカラーをannotationの状態によって変更する。

MKPointAnnotationでは、マーカー座標、タイトル、サブタイトルの指定しか行えないので、MKPinAnnotationViewMKMarkerAnnotationViewを使用する。

MKPointAnnotationの拡張クラス

はじめに、MKPinAnnotationViewMKMarkerAnnotationViewはMKPointAnnotation設置時のdelegateメソッドで生成し、AnnotationViewを返すので、MKPointAnnotationにマーカー色を決定する状態を保持するプロパティを持っておく必要がある。

よって、MKPointAnnotationを拡張したinner classを用意しておく。

class StatusMKPointAnnotation: MKPointAnnotation{
    var status:String = ""
}

let mapView:MKMapView!
let status:String = ""

override func viewDidLoad() {
    super.viewDidLoad()
    self.mapView.delegate = self
    let pin = StatusMKPointAnnotation()
    pin.coordinate = position
    //色を識別するstatusを保持
    pin.status = self.status
    self.mapView.addAnnotation(pin)
}
マーカーカラーの変更を行う

あとはstatusに応じたマーカーカラーの変更を行う処理をdelegateメソッドに記述すればよい。

extension MyMapViewController: MKMapViewDelegate{
    
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        let statusMKPointAnnotation = annotation as! StatusMKPointAnnotation
        let pinView = MKMarkerAnnotationView(annotation: statusMKPointAnnotation, reuseIdentifier: nil)

        if( statusMKPointAnnotation.status == "new" ){
            pinView.markerTintColor = UIColor.red
        }else if(statusMKPointAnnotation.status == "assigned" ){
            pinView.markerTintColor = UIColor.blue
        }else if(statusMKPointAnnotation.status == "close" ){
            pinView.markerTintColor = UIColor.darkGray
        }
        return pinView
    }
}