GMSMapView
を備えたビューコントローラーがあり、いくつかのマーカーをマップにロードしました。選択したマーカーをmapView.selectedMarker = ...
で変更できますが、選択したマーカーの色を変更するにはどうすればよいですか?
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
}
}
単純な方法Swift 5
marker.icon = GMSMarker.markerImage(with: UIColor.green)
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)
ユーザーがマップ上の非マーカーをタップした場合、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をトリガーするため機能します。