Eventos

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Selecione a plataforma: Android iOS JavaScript

Com o SDK do Maps para iOS, você pode detectar eventos que ocorrem no mapa, como eventos de mudança de câmera ou eventos de toque no marcador.

Introdução

Para detectar eventos, é necessário implementar o protocolo GMSMapViewDelegate. Normalmente, esse protocolo é implementado no controlador de visualização que mostra o mapa. Veja um exemplo abaixo:

Swift

import GoogleMaps

class Events: UIViewController, GMSMapViewDelegate {
  // ...
}
      

Objective-C

@import GoogleMaps;

@interface Events : UIViewController <GMSMapViewDelegate>

@end
      

Quando GMSMapView é criado, é possível definir seu delegado como seu controlador de visualização. GMSMapViewDelegate fornece apenas métodos opcionais. Para detectar um evento específico, você precisa implementar o método relevante.

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);
}
      

Posição da câmera

Com o GMSMapViewDelegate, é possível detectar alterações na posição da câmera usada para renderizar o mapa. Há três eventos distintos:

  • mapView:willMove: indica que a posição da câmera está prestes a mudar. Se o argumento gesture estiver definido como YES, isso ocorre porque um usuário realiza um gesto natural no GMSMapView, como movimentar ou inclinar. Caso contrário, NO indica que ela faz parte de uma mudança programática, por exemplo, usando métodos como animateToCameraPosition: ou atualizando diretamente a camada do mapa. Também pode ser NO se um usuário tocou nos botões Meu local ou de bússola, que geram animações que mudam a câmera.

    Esse método pode ser chamado várias vezes antes de mapView:idleAtCameraPosition: ser invocado, embora isso normalmente aconteça apenas se animações e gestos ocorrerem ao mesmo tempo. Por exemplo, um gesto cancelará qualquer animação atual e chamará mapView:willMove: uma segunda vez.

  • O mapView:didChangeCameraPosition: é chamado repetidamente durante um gesto ou animação, sempre após uma chamada para mapView:willMove:. Ele recebe a posição intermediária da câmera.

  • Por fim, o mapView:idleAtCameraPosition: é invocado quando a posição da câmera GMSMapView fica inativa e especifica a posição relevante da câmera. Nesse momento, todas as animações e gestos foram interrompidos.

    Os apps podem usar esse evento para acionar uma atualização de marcadores ou outro conteúdo que é exibido na GMSMapView, em vez de, por exemplo, recarregar o conteúdo a cada mudança da câmera.

Por exemplo, um aplicativo pode limpar o GMSMapView em movimento e, em seguida, geocodificar inversamente a posição em que a câmera se encontra.

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 em pontos de interesse comerciais e de outros tipos

Por padrão, os pontos de interesse (POIs, na sigla em inglês) aparecem no mapa de base junto com seus respectivos ícones. Os POIs incluem parques, escolas, estabelecimentos do governo e outros, além de POIs comerciais, como lojas, restaurantes e hotéis.

Você pode responder a eventos de clique em um PDI. Consulte o guia sobre pontos de interesse comerciais e de outros tipos.

Outros eventos

Para saber mais sobre a lista completa de métodos em GMSMapViewDelegate, consulte o guia de referência.