Com o SDK do Maps para iOS, é possível detectar eventos que ocorrem no mapa, como eventos de alteração da câmera ou de toque no marcador.
Introdução
Para detectar eventos, você precisa implementar o protocolo GMSMapViewDelegate
. Normalmente, esse protocolo é implementado no controlador de visualização que exibe o mapa. Veja um exemplo abaixo:
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
Objective-C
@import GoogleMaps; @interface Events : UIViewController <GMSMapViewDelegate> @end
Quando o GMSMapView
é criado, é possível definir o delegado como seu controlador de
visualização. 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 mudanças na posição da câmera usadas 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 argumentogesture
está definido comoYES
, isso ocorre porque um usuário executa um gesto natural naGMSMapView
, como uma panorâmica ou uma inclinação. Caso contrário,NO
indica que se trata de parte de uma mudança programática, por exemplo, por meio de métodos comoanimateToCameraPosition:
ou atualizando diretamente a camada do mapa. Também pode serNO
se um usuário tocou nos botões "Meu Local" ou "Bússola", gerando animações que mudam a câmera.Esse método pode ser chamado várias vezes antes de
mapView:idleAtCameraPosition:
ser invocado, embora isso geralmente aconteça apenas se animações e gestos ocorrerem ao mesmo tempo. Um gesto cancelará qualquer animação atual, por exemplo, e chamarámapView:willMove:
uma segunda vez.mapView:didChangeCameraPosition:
é chamado repetidamente durante um gesto ou animação, sempre após uma chamada paramapView:willMove:
. Ele recebe a posição intermediária da câmera.Por fim,
mapView:idleAtCameraPosition:
é invocado quando a posição da câmera emGMSMapView
fica inativa e especifica a posição relevante da câmera. Nesse momento, todas as animações e gestos foram interrompidos.Os aplicativos podem usar esse evento para acionar uma atualização de marcadores ou outro conteúdo que está sendo exibido no
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
na movimentação e,
em seguida, geocodificar inversamente a posição em que a câmera fica ociosa.
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 estabelecimentos e outros pontos de interesse.
Outros eventos
Para saber mais sobre a lista completa de métodos em GMSMapViewDelegate
, consulte
o guia de referência.