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 GMSMapView
możesz ustawić jego delegata na kontrolerze widoku. GMSMapViewDelegate
zawiera tylko opcjonalne metody. 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 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); }
Pozycja kamery
Za pomocą GMSMapViewDelegate
możesz nasłuchiwać zmian pozycji kamery używanej do renderowania mapy. Występują 3 różne zdarzenia.
mapView:willMove:
oznacza, że pozycja kamery ma się zmienić. Jeśli argumentgesture
ma wartośćYES
, oznacza to, że użytkownik wykonał naturalny gest na urządzeniuGMSMapView
, np. przesunięcie lub przechylenie. W przeciwnym razieNO
oznacza, że jest to część zmiany programowej, na przykład za pomocą metod takich jakanimateToCameraPosition:
lub bezpośrednia aktualizacja warstwy mapy. Może to być też spowodowane tym, że użytkownik kliknął przyciski Moja lokalizacja lub Kompas, które generują animacje zmieniające ustawienia aparatu.NO
Ta metoda może być wywoływana kilka razy przed wywołaniem
mapView:idleAtCameraPosition:
, ale zwykle zdarza się to 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 gestów lub animacji, zawsze po wywołaniu funkcjimapView:willMove:
. Jest ona przekazywana po pośredniej pozycji kamery.Na koniec wywoływana jest funkcja
mapView:idleAtCameraPosition:
, gdy pozycja kameryGMSMapView
staje się nieaktywna, i określa odpowiednią pozycję kamery. W tym momencie wszystkie animacje i gesty zostały zatrzymane.Aplikacje mogą używać tego zdarzenia do wywołania odświeżenia znaczników lub innych treści wyświetlanych na
GMSMapView
, zamiast np. wczytywania treści przy każdej zmianie kamery.
Aplikacja może na przykład wyczyścić GMSMapView
podczas przemieszczania, a potem odkodować odwrotnie pozycję, w której zatrzymała 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
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 dotyczące firm i innych miejsc wartych odwiedzenia.
Domyślnie ciekawe miejsca (POI) są widoczne na mapie podstawowej wraz z odpowiednimi ikonami. Ważne miejsca to m.in. parki, szkoły, budynki rządowe oraz punkty usługowe, takie jak sklepy, restauracje i hotele.
Możesz odpowiadać na zdarzenia kliknięcia w miejscu docelowym. Zapoznaj się z przewodnikiem dotyczącym firm i innych punktów zainteresowania.
Inne zdarzenia
Pełną listę metod dotyczących GMSMapViewDelegate
znajdziesz w przewodniku.