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 impostare il relativo delegato sul tuo view controller. 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 options = GMSMapViewOptions() options.camera = camera let mapView = GMSMapView(options: options) 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]; GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = camera; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; 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 fotocamera
utilizzata per eseguire il rendering della mappa. Esistono 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 suGMSMapView, ad esempio una panoramica o un'inclinazione. In caso contrario,NOindica che fa parte di una modifica programmatica, ad esempio tramite metodi comeanimateToCameraPosition:o l'aggiornamento diretto del livello della mappa. Questo valore può anche essereNOse un utente ha toccato i pulsanti La mia posizione o Bussola, che generano animazioni che modificano la fotocamera.Questo metodo può essere chiamato più volte prima che venga richiamato
mapView:idleAtCameraPosition:, anche se in genere questo accade solo se le animazioni e i gesti si verificano contemporaneamente. Ad esempio, un gesto 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 superata la posizione intermedia della videocamera.Infine,
mapView:idleAtCameraPosition:viene richiamato quando la posizione della fotocamera suGMSMapViewdiventa inattiva e specifica la posizione della fotocamera pertinente. A questo punto, tutte le animazioni e i gesti si sono 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 fotocamera.
Ad esempio, un'applicazione può cancellare l'elemento GMSMapView durante lo spostamento, quindi 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
static 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 d'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 alle attività e ad altri punti d'interesse.
Altri eventi
Per scoprire l'elenco completo dei metodi su GMSMapViewDelegate, consulta
la guida di riferimento.