Eventi

Seleziona la piattaforma: Android iOS JavaScript

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

Introduzione

Per rimanere in ascolto degli eventi, devi implementare il metodo GMSMapViewDelegate. Di solito, 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
      

Quando viene creato GMSMapView, puoi impostare il delegato sulla tua vista un controller di deployment. L'GMSMapViewDelegate fornisce solo metodi facoltativi. Per ascoltare a un 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 le modifiche alla posizione della fotocamera utilizzato per eseguire il rendering della mappa. Ci sono tre eventi distinti.

  • mapView:willMove: indica che la posizione della fotocamera sta per cambiare. Se l'argomento gesture è impostato su YES, è dovuto all'esecuzione di un utente un gesto naturale su GMSMapView, come una panoramica o un'inclinazione. In caso contrario, NO indica che si tratta di una modifica programmatica - ad esempio tramite metodi come animateToCameraPosition: o l'aggiornamento direttamente il livello della mappa. Potrebbe anche essere NO se un utente ha toccato Pulsanti di posizione o bussola, che generano animazioni che modificano fotocamera.

    Questo metodo può essere richiamato diverse volte prima mapView:idleAtCameraPosition: viene richiamato, anche se in genere si tratta si verifica solo se le animazioni e i gesti si verificano contemporaneamente: un gesto annullerà qualsiasi animazione corrente, ad esempio, e richiamerà mapView:willMove: una seconda volta.

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

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

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

Ad esempio, un'applicazione può cancellare GMSMapView in movimento e quindi geocodifica invertita la posizione su cui si appoggia la fotocamera.

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 su attività e altri punti di 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é PDI di attività come negozi, ristoranti e hotel.

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

Altri eventi

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