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)
}
}
// 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)
}
}
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)
}
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.
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:
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.