Eventos

Selecciona la plataforma: Android iOS JavaScript

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 crea GMSMapView, puedes establecer su delegado en tu controlador de vista. 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 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);
}
      

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á a punto de cambiar. Si el argumento gesture se establece en YES, esto se debe a que un usuario realiza un gesto natural en GMSMapView, como un desplazamiento o una inclinación. De lo contrario, NO indica que esto forma parte de un cambio programático, por ejemplo, a través de métodos como animateToCameraPosition: o la actualización directa de la capa del mapa. El valor también puede ser NO si un usuario toca los botones de My Location o la brújula, que generan animaciones que cambian la cámara.

    Se puede llamar a este método varias veces antes de invocar a mapView:idleAtCameraPosition:, aunque esto suele suceder solo si las animaciones y los gestos ocurren al mismo tiempo; por ejemplo, un gesto cancelará cualquier animación actual y llamará a mapView:willMove: por segunda vez.

  • Se llama a mapView:didChangeCameraPosition: de manera repetida durante un gesto o una animación, siempre después de una llamada a mapView:willMove:. Recibe la posición intermedia de la cámara.

  • Por último, se invoca a mapView:idleAtCameraPosition: una vez que la posición de la cámara en GMSMapView queda inactiva, y se especifica la posición correspondiente de la cámara. 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 marcadores u otro contenido que se muestre en GMSMapView, en lugar de, por ejemplo, recargar el contenido con cada cambio de cámara.

Por ejemplo, una aplicación puede borrar el GMSMapView en movimiento y, luego, geocodificar de forma inversa 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

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 de GMSMapViewDelegate, consulta la guía de referencia.