Dzięki pakietowi Maps SDK na iOS możesz nasłuchiwać zdarzeń, które występują na mapie, takich jak zdarzenia zmiany kamery czy zdarzenia kliknięcia znacznika.
Wprowadzenie
Aby nasłuchiwać zdarzeń, musisz zaimplementować protokół GMSMapViewDelegate. Protokół ten zwykle implementuje się w kontrolerze widoku, który wyświetla mapę. Oto przykład:
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
Objective-C
@import GoogleMaps; @interface Events : UIViewController <GMSMapViewDelegate> @end
Po utworzeniu obiektu GMSMapView możesz ustawić jego delegata na kontroler widoku. Interfejs GMSMapViewDelegate udostępnia tylko metody opcjonalne. Aby nasłuchiwać konkretnego zdarzenia, musisz zaimplementować odpowiednią metodę.
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); }
Pozycja kamery
Dzięki GMSMapViewDelegate możesz nasłuchiwać zmian pozycji kamery używanej do renderowania mapy. Wyróżniamy 3 rodzaje zdarzeń.
mapView:willMove:oznacza, że pozycja kamery zostanie zmieniona. Jeśli argumentgesturejest ustawiony naYES, jest to spowodowane wykonaniem przez użytkownika naturalnego gestu na elemencieGMSMapView, takiego jak przesunięcie lub pochylenie. W przeciwnym razie wartośćNOwskazuje, że jest to część zmiany automatycznej – na przykład za pomocą metod takich jakanimateToCameraPosition:lub bezpośredniej aktualizacji warstwy mapy. Może to być równieżNO, jeśli użytkownik kliknął przycisk Moja lokalizacja lub kompas, co powoduje wygenerowanie animacji zmieniających kamerę.Ta metoda może zostać wywołana kilka razy przed wywołaniem
mapView:idleAtCameraPosition:, chociaż zwykle dzieje się tak tylko wtedy, gdy animacje i gesty występują jednocześnie – gest anuluje na przykład bieżącą animację i wywołamapView:willMove:po raz drugi.Funkcja
mapView:didChangeCameraPosition:jest wywoływana wielokrotnie podczas gestu lub animacji, zawsze po wywołaniu funkcjimapView:willMove:. Przekazywana jest do niego pośrednia pozycja kamery.Na koniec wywoływana jest funkcja
mapView:idleAtCameraPosition:, gdy pozycja kamery na mapieGMSMapViewstaje się bezczynna, i określa odpowiednią pozycję kamery. W tym momencie wszystkie animacje i gesty zostaną zatrzymane.Aplikacje mogą używać tego zdarzenia do wywoływania odświeżania znaczników lub innych treści wyświetlanych na
GMSMapView, zamiast np. ponownego wczytywania treści przy każdej zmianie kamery.
Na przykład aplikacja może wyczyścić GMSMapView podczas ruchu, a następnie wykonać odwrotne geokodowanie pozycji, na której zatrzyma się kamera.
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]; }
Wydarzenia w firmach i innych ważnych miejscach
Domyślnie ciekawe miejsca są wyświetlane na mapie podstawowej wraz z odpowiednimi ikonami. Miejsca te obejmują parki, szkoły, budynki rządowe i inne, a także ważne miejsca z kategorii biznesowej, takie jak sklepy, restauracje i hotele.
Możesz reagować na zdarzenia kliknięcia ciekawego miejsca. Zapoznaj się z przewodnikiem po firmach i innych ważnych miejscach.
Inne zdarzenia
Pełną listę metod w GMSMapViewDelegate znajdziesz w dokumentacji.