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, devi 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 impostare il relativo delegato sul controller della 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 della videocamera
Utilizzando GMSMapViewDelegate, puoi ascoltare le modifiche alla posizione della videocamera
utilizzata per il rendering della mappa. Ci sono tre eventi distinti.
mapView:willMove:indica che la posizione della videocamera sta per cambiare. Se l'argomentogestureè impostato suYES, ciò è dovuto a un utente che esegue un gesto naturale sulGMSMapView, ad esempio una panoramica o un'inclinazione. In caso contrario,NOindica che si tratta di una modifica programmatica, ad esempio tramite metodi comeanimateToCameraPosition:o l'aggiornamento diretto del livello della mappa. Questo può verificarsi ancheNOse un utente ha toccato i pulsanti La mia posizione o Bussola, che generano animazioni che cambiano la videocamera.Questo metodo può essere chiamato più volte prima che venga richiamato
mapView:idleAtCameraPosition:, anche se in genere ciò accade solo se animazioni e gesti si verificano contemporaneamente. Un gesto annullerà qualsiasi animazione corrente, ad esempio, e chiameràmapView:willMove:una seconda volta.mapView:didChangeCameraPosition:viene chiamato ripetutamente durante un gesto o un'animazione, sempre dopo una chiamata amapView:willMove:. Ha superato la posizione intermedia della videocamera.Infine,
mapView:idleAtCameraPosition:viene richiamato quando la posizione della videocamera suGMSMapViewdiventa 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 dei marcatori o di altri contenuti visualizzati su
GMSMapView, anziché, ad esempio, ricaricare i contenuti a ogni cambio di videocamera.
Ad esempio, un'applicazione può cancellare GMSMapView durante lo spostamento e poi
eseguire la geocodifica inversa 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 relativi ad attività e altri punti di interesse
Per impostazione predefinita, i punti di interesse vengono visualizzati sulla mappa di base insieme alle icone corrispondenti. 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 di interesse.
Altri eventi
Per scoprire l'elenco completo dei metodi su GMSMapViewDelegate, consulta
la guida di riferimento.