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 protocollo GMSMapViewDelegate
. 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 impostarne il delegato sul tuo controllore della vista. GMSMapViewDelegate
fornisce solo metodi facoltativi. Per ascoltare un determinato evento, 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 della videocamera
Utilizzando GMSMapViewDelegate
, puoi ascoltare le modifiche alla posizione della fotocamera impiegata per il rendering della mappa. Esistono tre eventi distinti.
mapView:willMove:
indica che la posizione della videocamera sta per cambiare. Se l'argomentogesture
è impostato suYES
, significa che un utente sta eseguendo un gesto naturale sulGMSMapView
, ad esempio una panoramica o un'inclinazione. In caso contrario,NO
indica che si tratta di una modifica programmatica, ad esempio tramite metodi comeanimateToCameraPosition:
o l'aggiornamento diretto del livello della mappa. L'iconaNO
può essere visualizzata anche se un utente ha toccato i pulsanti Posizione attuale o Bussola, che generano animazioni che modificano la fotocamera.Questo metodo può essere chiamato più volte prima che venga invocato
mapView:idleAtCameraPosition:
, anche se in genere accade solo se le animazioni e i gesti si verificano contemporaneamente: un gesto, ad esempio, annulla qualsiasi animazione corrente e chiamamapView:willMove:
una seconda volta.mapView:didChangeCameraPosition:
viene chiamato ripetutamente durante un gesto o un'animazione, sempre dopo una chiamata amapView:willMove:
. Viene passata la posizione intermedia della videocamera.Infine,
mapView:idleAtCameraPosition:
viene invocato quando la posizione della videocamera suGMSMapView
diventa inattiva e specifica la posizione pertinente della videocamera. 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 cambio di fotocamera.
Ad esempio, un'applicazione può cancellare il GMSMapView
durante il movimento e poi eseguire la geocodifica inversa della posizione in cui si ferma 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 in attività e altri punti di interesse
Per impostazione predefinita, i punti di interesse (PDI) vengono visualizzati sulla mappa di base insieme alle relative icone. I PDI includono parchi, scuole, edifici governativi e altro ancora, nonché PDI commerciali come negozi, ristoranti e hotel.
Puoi rispondere agli eventi di clic su un PDI. Consulta la guida alle attività e ad altri punti d'interesse.
Altri eventi
Per conoscere l'elenco completo dei metodi in GMSMapViewDelegate
, consulta la
guida di riferimento.