web-dev-qa-db-ja.com

迅速に選択されたときにGoogleマップのマーカーの色を変更するにはどうすればよいですか?

GMSMapViewを備えたビューコントローラーがあり、いくつかのマーカーをマップにロードしました。選択したマーカーをmapView.selectedMarker = ...で変更できますが、選択したマーカーの色を変更するにはどうすればよいですか?

9
Derek Soike

GMSMarker.markerImage(with: <UIColor?>)を使用して、マーカーのアイコンをリセットできます。

ドキュメント: Google Maps iOS SDK GMSMarker Class Reference

import GoogleMaps

// view controller
class MapViewController: UIViewController {

    // outlets
    @IBOutlet weak var mapView: GMSMapView!

    // view did load method
    override func viewDidLoad() {
        super.viewDidLoad()

        // set map view delegate
        mapView.delegate = self
    }
}

// extension for GMSMapViewDelegate
extension MapViewController: GMSMapViewDelegate {

    // tap map marker
    func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
        print("didTap marker \(marker.title)")

        // remove color from currently selected marker
        if let selectedMarker = mapView.selectedMarker {
            selectedMarker.icon = GMSMarker.markerImage(with: nil)
        }

        // select new marker and make green
        mapView.selectedMarker = marker
        marker.icon = GMSMarker.markerImage(with: UIColor.green)

        // tap event handled by delegate
        return true
    }
}
21
Derek Soike

単純な方法Swift 5

marker.icon = GMSMarker.markerImage(with: UIColor.green)
2
Shakeel Ahmed

RxSwiftを使用する場合、以下は RxGoogleMaps を使用したエレガントなソリューションです。

Observable.combineLatest(mapView.rx.selectedMarker,
                         mapView.rx.selectedMarker.skip(1))
    .subscribe(onNext: { (old, new) in
        old?.icon = GMSMarker.markerImage(with: nil)
        new?.icon = GMSMarker.markerImage(with: UIColor.red)
    })
    .disposed(by: disposeBag)
1
duan

ユーザーがマップ上の非マーカーをタップした場合、selectedMarkerはnilに設定されるため、受け入れられた回答は私にとってはうまくいきませんでした。その後、ユーザーが別のマーカーをタップして、didTapコールバックをトリガーすると、selectedMarkerはnilになるため、選択された状態/色が保持されます。

私の修正は、didTapからselectedMarkerロジックを削除して、didCloseWindowOfに移動することでした。

これがコードです:

func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
    marker.icon = UIImage(named: "map_marker_selected")
    return false // return false to display info window
}

func mapView(_ mapView: GMSMapView, didCloseInfoWindowOf marker: GMSMarker) {
    marker.icon = UIImage(named: "map_marker_unselected")
}

これは、ユーザーが非マーカーをタップすると情報ウィンドウが閉じ、didCloseInfoWindowOfをトリガーするため機能します。

1
Braden Holt