Con el SDK de Maps para iOS, puedes escuchar eventos que ocurren en el mapa, como eventos de cambio de cámara o eventos de presión de marcadores.
Introducción
Para escuchar eventos, debes implementar el protocolo GMSMapViewDelegate. Por lo general, implementas este protocolo en el controlador de vista que muestra el mapa. A continuación, se muestra un ejemplo.
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
Objective-C
@import GoogleMaps; @interface Events : UIViewController <GMSMapViewDelegate> @end
Cuando se cree el GMSMapView, podrás establecer su delegado en tu controlador de vista. La clase GMSMapViewDelegate solo proporciona métodos opcionales. Para escuchar cualquier evento en particular, debes implementar el método correspondiente.
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); }
Posición de la cámara
Con GMSMapViewDelegate, puedes escuchar los cambios en la posición de la cámara que se usa para renderizar el mapa. Existen tres eventos diferentes:
mapView:willMove:indica que la posición de la cámara está por cambiar. Si el argumentogesturese establece enYES, se debe a que un usuario realizó un gesto natural en elGMSMapView, como un desplazamiento lateral o una inclinación. De lo contrario,NOindica que esto es parte de un cambio programático, por ejemplo, a través de métodos comoanimateToCameraPosition:o la actualización directa de la capa del mapa. Esto también puede serNOsi un usuario presionó los botones Mi ubicación o Brújula, que generan animaciones que cambian la cámara.Es posible que se llame a este método varias veces antes de que se invoque
mapView:idleAtCameraPosition:, aunque esto suele ocurrir solo si las animaciones y los gestos se producen al mismo tiempo. Por ejemplo, un gesto cancelará cualquier animación actual y llamará amapView:willMove:por segunda vez.Se llama a
mapView:didChangeCameraPosition:de forma repetida durante un gesto o una animación, siempre después de una llamada amapView:willMove:. Se le pasa la posición intermedia de la cámara.Por último, se invoca
mapView:idleAtCameraPosition:una vez que la posición de la cámara enGMSMapViewqueda inactiva y se especifica la posición de la cámara correspondiente. En este punto, las animaciones y los gestos se encuentran detenidos en su totalidad.Las aplicaciones pueden usar este evento para activar una actualización de los marcadores o de otro contenido que se muestra en el
GMSMapView, en lugar de, por ejemplo, volver a cargar el contenido en cada cambio de cámara.
Por ejemplo, una aplicación puede borrar el objeto GMSMapView cuando se mueve y, luego, aplicar la geocodificación inversa a la posición en la que se detiene la cámara.
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]; }
Eventos en empresas y otros lugares de interés
De forma predeterminada, los puntos de interés (POI) aparecen en el mapa básico con sus íconos correspondientes. Entre los POI se encuentran los parques, las escuelas y los edificios gubernamentales, además de POI de negocios, como tiendas, restaurantes y hoteles.
Puedes responder a eventos de clic en un lugar de interés. Consulta la guía sobre empresas y otros lugares de interés.
Otros eventos
Para conocer la lista completa de métodos en GMSMapViewDelegate, consulta
la guía de referencia.