Com o SDK do Maps para iOS, é possível detectar eventos que ocorrem no mapa, como alteração da câmera ou toque no marcador.
Introdução
Para detectar os eventos, é necessário implementar o protocolo GMSMapViewDelegate. Normalmente, você implementa esse protocolo no controlador de visualizações 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 for criado, você poderá definir o delegado dele para o controlador de visualização. O GMSMapViewDelegate fornece apenas métodos opcionais. Para detectar
um evento específico, é necessário implementar o método relevante.
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); }
Posição da câmera
Com o GMSMapViewDelegate, é possível detectar mudanças 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 argumentogesturefor definido comoYES, isso se deve a um gesto natural do usuário noGMSMapView, como uma panorâmica ou inclinação. Caso contrário,NOindica que isso faz parte de uma mudança programática, por exemplo, usando métodos comoanimateToCameraPosition:ou atualizando a camada do mapa diretamente. Também pode serNOse um usuário tiver tocado nos botões "Minha localização" ou "Bússola", que geram animações que mudam a câmera.Esse método pode ser chamado várias vezes antes que
mapView:idleAtCameraPosition:seja invocado, embora isso normalmente só aconteça se as animações e os gestos ocorrerem ao mesmo tempo. Um gesto cancela qualquer animação atual, por exemplo, e chamamapView:willMove:uma segunda vez.mapView:didChangeCameraPosition:é chamado repetidamente durante um gesto ou uma animação, sempre após uma chamada paramapView:willMove:. A posição intermediária da câmera é transmitida.Por fim,
mapView:idleAtCameraPosition:é invocado quando a posição da câmera emGMSMapViewfica 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 de outro conteúdo exibido no
GMSMapView, em vez de, por exemplo, recarregar o conteúdo a cada mudança de câmera.
Por exemplo, um aplicativo pode limpar o GMSMapView ao se mover e, em seguida,
fazer a geocodificação inversa da posição em que a câmera para.
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 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 aprender mais sobre a lista completa de métodos em GMSMapViewDelegate, consulte
o guia de referência.