J'ai un contrôleur d'affichage avec un gmsmapview code> et avez chargé un nombre de marqueurs sur la carte. Je peux changer quel marqueur est sélectionné avec
mapviev.electedmarker = ... code> mais comment puis-je modifier la couleur du marqueur sélectionné? P>
4 Réponses :
Vous pouvez utiliser Docs: Google Maps IOS SDK GMSMarker Classe Référence P> gmsmarker.markerImage (avec:
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
}
}
Si vous appuyez sur un marqueur, appuyez sur le sol, puis appuyez sur un autre marqueur, il y aura deux marqueurs sélectionnés.
Comme @duan a suggéré qu'il y a eu un problème avec votre solution.
Ya il semble que lorsque vous réglez le marqueur sélectionné manuellement, le comportement décrit par @duan se produit. L'API Google Maps définit automatiquement le marqueur sélectionné pour vous, il n'y a donc pas besoin de cette ligne mapview.electedmarker = marqueur code>.
Si vous utilisez RxSwift, voici une solution élégante avec 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)
Il y a aussi un exemple officiel dans leur docs qui utilise observable.zip code> au lieu de
observable.combinelatst code>: GITUB.COM/RXSWIFTCOMMUNITÉ/RXGOOGLEMAPS/BLOB/MASTER/Example / ...
SIMPLE SWIFT 5
marker.icon = GMSMarker.markerImage(with: UIColor.green)
La réponse acceptée ne fonctionnait pas pour moi car si un utilisateur a exploité un non-marqueur sur la carte, SelectMarker serait défini sur NIL. Si l'utilisateur a ensuite appuyé un autre marqueur, déclencher le rappel DidTap, le Memberker sélectionné serait nul et conservera donc son état / couleur sélectionné.
Le correctif pour moi était de supprimer cette logique de DidTaper et de la déplacer à DidcoseWindowof. p>
Voici le code: p> Ceci fonctionne car lorsque l'utilisateur tape un non-marqueur, la fenêtre d'information se ferme qui déclenche DidcoseInfowindowof. P> p>