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
. 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 delegato sulla tua vista
un controller di deployment. 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 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'argomentogesture
è impostato suYES
, è dovuto all'esecuzione di un utente un gesto naturale suGMSMapView
, come 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 direttamente il livello della mappa. Potrebbe anche essereNO
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 amapView:willMove:
. Viene superato il parametro posizione intermedia della fotocamera.Infine,
mapView:idleAtCameraPosition:
viene richiamato una volta che la posizione della fotocamera suGMSMapView
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 in 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.