Eventi

Seleziona la piattaforma: Android iOS JavaScript

Utilizzando Maps SDK for iOS, puoi ascoltare gli eventi che accadono sulla mappa, come eventi di modifica della fotocamera o eventi di tocco dell'indicatore.

Introduzione

Per ascoltare gli eventi, è necessario implementare il GMSMapViewDelegate protocollo. In genere, si implementa questo protocollo sul controller di visualizzazione che visualizza 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 relativo delegato sul controller di visualizzazione. GMSMapViewDelegate fornisce solo metodi facoltativi. Per ascoltare un evento specifico, 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 videocamera

Utilizzando GMSMapViewDelegate, puoi ascoltare le modifiche alla posizione della videocamera utilizzata per il rendering della mappa. Esistono tre eventi distinti.

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

    Questo metodo può essere chiamato più volte prima che venga richiamato mapView:idleAtCameraPosition:, anche se in genere ciò accade solo se si verificano contemporaneamente animazioni e gesti. Ad esempio, un gesto annullerà qualsiasi animazione corrente e chiamerà mapView:willMove: una seconda volta.

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

  • Infine, mapView:idleAtCameraPosition: viene richiamato quando la posizione della videocamera su GMSMapView diventa inattiva e specifica la posizione della videocamera 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 su GMSMapView, anziché, ad esempio, ricaricare i contenuti a ogni modifica della videocamera.

Ad esempio, un'applicazione può cancellare GMSMapView durante lo spostamento e poi eseguire il geocoding inverso della posizione in cui si ferma la videocamera.

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 aziendali come negozi, ristoranti e hotel.

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

Altri eventi

Per un elenco completo dei metodi di GMSMapViewDelegate, consulta la guida di riferimento.