9
votes

Comment changer la couleur du marqueur Google Maps lorsque sélectionné à Swift?

J'ai un contrôleur d'affichage avec un gmsmapview et avez chargé un nombre de marqueurs sur la carte. Je peux changer quel marqueur est sélectionné avec mapviev.electedmarker = ... mais comment puis-je modifier la couleur du marqueur sélectionné?


0 commentaires

4 Réponses :


23
votes

Vous pouvez utiliser gmsmarker.markerImage (avec: ) code> Pour réinitialiser l'icône d'un marqueur.

Docs: Google Maps IOS SDK GMSMarker Classe Référence P>

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


3 commentaires

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 .



1
votes

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)


1 commentaires

Il y a aussi un exemple officiel dans leur docs qui utilise observable.zip au lieu de observable.combinelatst : GITUB.COM/RXSWIFTCOMMUNITÉ/RXGOOGLEMAPS/BLOB/MASTER/Example / ...



3
votes

SIMPLE SWIFT 5

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


0 commentaires

1
votes

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.

Voici le code: xxx

Ceci fonctionne car lorsque l'utilisateur tape un non-marqueur, la fenêtre d'information se ferme qui déclenche DidcoseInfowindowof.


0 commentaires