web-dev-qa-db-fra.com

Comment déplacer le marqueur avec le déplacement de Google Map dans iOS?

J'affiche un marqueur à un endroit particulier, ainsi que l'adresse actuelle dans l'étiquette d'adresse sur Google Maps.

Maintenant, je veux changer l'emplacement en déplaçant la carte Google, mais le problème est que lorsque je déplace la carte, je devrais déplacer simultanément le marqueur avec la carte, et je devrais afficher l'adresse de cet emplacement dans l'étiquette d'adresse .

Comment puis je faire ça?

J'ai essayé ceci:

let destinationMarker = GMSMarker(position: self.destinationLocation.coordinate)

let image = UIImage(named:"sourcemarker")
destinationMarker.icon = image
destinationMarker.draggable = true
destinationMarker.map = self.viewMap
//viewMap.selectedMarker = destinationMarker
destinationMarker.title = "hi"
destinationMarker.userData = "changedestination"

func mapView(mapView: GMSMapView, didEndDraggingMarker marker: GMSMarker)
{
    if marker.userData as! String == "changedestination"
    {
        self.destinationLocation = CLLocation(latitude: marker.position.latitude, longitude: marker.position.longitude)
        self.destinationCoordinate = self.destinationLocation.coordinate
        //getAddressFromLatLong(destinationCoordinate)
    }
}
11
Shilpashree MC
// UpdteLocationCoordinate
    func updateLocationoordinates(coordinates:CLLocationCoordinate2D) {
        if destinationMarker == nil
        {
            destinationMarker = GMSMarker()
            destinationMarker.position = coordinates
            let image = UIImage(named:"destinationmarker")
            destinationMarker.icon = image
            destinationMarker.map = viewMap
            destinationMarker.appearAnimation = kGMSMarkerAnimationPop
        }
        else
        {
            CATransaction.begin()
            CATransaction.setAnimationDuration(1.0)
            destinationMarker.position =  coordinates
            CATransaction.commit()
        }
    }

    // Camera change Position this methods will call every time
    func mapView(mapView: GMSMapView, didChangeCameraPosition position: GMSCameraPosition) {
        let destinationLocation = CLLocation()
        if self.mapGesture == true
        {
            destinationLocation = CLLocation(latitude: position.target.latitude,  longitude: position.target.longitude)
            destinationCoordinate = destinationLocation.coordinate
            updateLocationoordinates(destinationCoordinate)
        }
    }
12
Shilpashree MC

Mise à jour pour Swift 4:

Vous devez d'abord vous conformer au GMSMapViewDelegate :

extension MapsVC: GMSMapViewDelegate{

Et puis définissez votre VC comme délégué de viewMap dans le viewDidLoad ()

viewMap.delegate = self

Après cela, il vous suffit d'utiliser la méthode suivante pour obtenir des mises à jour à partir de la position de la caméra et la définir comme nouvelle position pour le marqueur:

func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
    destinationMarker.position = position.target
    print(destinationMarker.position)
}
8
Hugo Jordao

Il y a une astuce qui peut vous aider ici. Au lieu d'utiliser un GMSMarker ici, placez une image pointant vers le centre, sur votre Google MapView.

Vous pouvez facilement trouver les coordonnées du centre de la carte en utilisant ceci:

double latitude = mapView.camera.target.latitude;
double longitude = mapView.camera.target.longitude;

Ou ca

GMSCoordinateBounds *bounds = nil;
bounds = [[GMSCoordinateBounds alloc] initWithRegion: visibleRegion];

CLLocationCoordinate2D centre = CLLocationCoordinate2DMake(
                                                           (bounds.southWest.latitude + bounds.northEast.latitude) / 2,
                                                           (bounds.southWest.longitude + bounds.northEast.longitude) / 2);

Vous pouvez maintenant obtenir l'adresse de l'emplacement en utilisant l'API de géocodage de Google.

Voici la référence: https://developers.google.com/maps/documentation/ios-sdk/reference/interface_g_m_s_geocoder

Vous pouvez actualiser l'adresse lorsque cette méthode déléguée est appelée:

- (void) mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position 

J'espère que cela t'aides.

3
Bharat

Basé sur Notes de version créé dans Maps SDK pour IOS, la modification de la position des marqueurs provoquera l'animation du marqueur vers le nouvel emplacement.

Pour résoudre ce problème, vous pouvez utiliser de nouvelles fonctionnalités pour GMSMarker comme indiqué dans version 1.5 telles que:

  • Les marqueurs peuvent être rendus glissables à l'aide de la propriété draggable, et de nouvelles méthodes de délégué de glissement ont été ajoutées à GMSMapViewDelegate. (Numéro 4975)
  • Ajout de GMSMarkerLayer, une sous-classe CALayer personnalisée pour GMSMarker qui prend en charge l'animation de la position et de la rotation des marqueurs. (Numéro 4951, Numéro 5743)

En plus de cela, ce message dans GitHub - GoogleMapsAnimationGlitch et ce SO post - Comment déplacer facilement GMSMarker le long des coordonnées dans l'objectif C pourrait aussi aider.

1
Teyam