Eventi

Seleziona la piattaforma: Android iOS JavaScript

Con Maps SDK for iOS, puoi ascoltare gli eventi che si verificano sulla mappa, come gli eventi di modifica della videocamera o gli eventi di tocco degli indicatori.

Introduzione

Per rimanere in ascolto degli eventi, devi implementare il protocollo GMSMapViewDelegate. In genere, implementi questo protocollo sul controller di visualizzazione che mostra la mappa. Di seguito è riportato un esempio:

Swift

import GoogleMaps

class Events: UIViewController, GMSMapViewDelegate {
  // ...
}
      

Objective-C

@import GoogleMaps;

@interface Events : UIViewController <GMSMapViewDelegate>

@end
      

Una volta creata la GMSMapView, puoi impostare il delegato su controller di visualizzazione. L'GMSMapViewDelegate fornisce solo metodi facoltativi. Per ascoltare qualsiasi evento particolare, devi implementare il metodo pertinente.

Swift

override func loadView() {
  super.loadView()
  let camera = GMSCameraPosition.camera(
    withLatitude: 1.285,
    longitude: 103.848,
    zoom: 12
  )
  let mapView = GMSMapView.map(withFrame: .zero, camera: camera)
  mapView.delegate = self
  self.view = mapView
}

// MARK: GMSMapViewDelegate

func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) {
  print("You tapped at \(coordinate.latitude), \(coordinate.longitude)")
}
      

Objective-C

- (void)loadView {
  [super loadView];
  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:1.285
                                                          longitude:103.848
                                                               zoom:12];
  GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
  mapView.delegate = self;
  self.view = mapView;
}

#pragma mark - GMSMapViewDelegate

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate {
  NSLog(@"You tapped at %f,%f", coordinate.latitude, coordinate.longitude);
}
      

Posizione fotocamera

Con GMSMapViewDelegate, puoi ascoltare i cambiamenti della posizione della fotocamera utilizzata per il rendering della mappa. Esistono tre eventi distinti.

  • mapView:willMove: indica che la posizione della fotocamera sta per cambiare. Se l'argomento gesture è impostato su YES, ciò è dovuto all'esecuzione di un gesto naturale su GMSMapView, ad esempio una panoramica o un'inclinazione. In caso contrario, NO indica che fa parte di un cambiamento programmatico, ad esempio tramite metodi come animateToCameraPosition: o aggiornando direttamente il livello della mappa. Può anche essere NO se un utente ha toccato i pulsanti La mia posizione o la bussola, che generano animazioni che cambiano la videocamera.

    Questo metodo può essere chiamato più volte prima di richiamare mapView:idleAtCameraPosition:, anche se in genere questo si verifica solo se animazioni e gesti si verificano contemporaneamente. Ad esempio, un gesto annulla qualsiasi animazione in corso e chiama mapView:willMove: una seconda volta.

  • mapView:didChangeCameraPosition: viene chiamato ripetutamente durante un gesto o un'animazione, sempre dopo una chiamata a mapView:willMove:. Ha superato la posizione intermedia della fotocamera.

  • Infine, mapView:idleAtCameraPosition: viene richiamato quando la posizione della fotocamera su GMSMapView diventa inattiva e specifica la posizione della fotocamera pertinente. A questo punto, tutte le animazioni e i gesti sono stati interrotti.

    Le applicazioni possono utilizzare questo evento per attivare un aggiornamento degli indicatori o di altri contenuti visualizzati sul GMSMapView, anziché, ad esempio, ricaricare i contenuti a ogni modifica della videocamera.

Ad esempio, un'applicazione può cancellare il GMSMapView mentre è in corso lo spostamento e quindi geocodificare in modo inverso la posizione su cui la videocamera si ferma.

Swift

let geocoder = GMSGeocoder()

func mapView(_ mapView: GMSMapView, willMove gesture: Bool) {
  mapView.clear()
}

func mapView(_ mapView: GMSMapView, idleAt cameraPosition: GMSCameraPosition) {
    geocoder.reverseGeocodeCoordinate(cameraPosition.target) { (response, error) in
      guard error == nil else {
        return
      }

      if let result = response?.firstResult() {
        let marker = GMSMarker()
        marker.position = cameraPosition.target
        marker.title = result.lines?[0]
        marker.snippet = result.lines?[1]
        marker.map = mapView
      }
    }
  }
      

Objective-C

GMSGeocoder *geocoder;

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture {
  [mapView clear];
}

- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)cameraPosition {
  id handler = ^(GMSReverseGeocodeResponse *response, NSError *error) {
    if (error != nil) {
      return;
    }
    GMSReverseGeocodeResult *result = response.firstResult;
    GMSMarker *marker = [GMSMarker markerWithPosition:cameraPosition.target];
    marker.title = result.lines[0];
    marker.snippet = result.lines[1];
    marker.map = mapView;
  };
  [geocoder reverseGeocodeCoordinate:cameraPosition.target completionHandler:handler];
}
      

Eventi relativi ad attività commerciali e altri punti d'interesse

Per impostazione predefinita, i punti di interesse (PDI) vengono visualizzati sulla mappa base insieme alle icone corrispondenti. I PDI includono parchi, scuole, edifici governativi e altro ancora, nonché punti di interesse aziendali come negozi, ristoranti e hotel.

Puoi rispondere agli eventi di clic su un PDI. Consulta la guida ad attività commerciali e altri punti d'interesse.

Altri eventi

Per conoscere l'elenco completo dei metodi disponibili su GMSMapViewDelegate, consulta la guida di riferimento.