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. 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 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. Są 3 różne zdarzenia.
mapView:willMove:oznacza, że pozycja kamery ma się zmienić. Jeśli argumentgesturema wartośćYES, oznacza to, że użytkownik wykonał naturalny gest na urządzeniuGMSMapView, np. przesunięcie lub pochylenie. W przeciwnym razie symbolNOoznacza, że jest to część zmiany programowej – np. za pomocą metod takich jakanimateToCameraPosition:lub bezpośrednie zaktualizowanie warstwy mapy. Może to być równieżNO, jeśli użytkownik kliknął przyciski Moja lokalizacja lub kompas, które generują animacje zmieniające kamerę.Ta metoda może być wywoływana kilka razy, zanim zostanie wywołana funkcja
mapView:idleAtCameraPosition:, chociaż zwykle dzieje się tak tylko wtedy, gdy animacje i gesty występują w tym samym czasie – gest anuluje na przykład bieżącą animację i wywoła funkcjęmapView:willMove:po raz drugi.mapView:didChangeCameraPosition:jest wywoływana wielokrotnie podczas gestu lub animacji, zawsze po wywołaniu funkcjimapView:willMove:. Przekazywana jest do niej pośrednia pozycja kamery.Na koniec wywoływana jest funkcja
mapView:idleAtCameraPosition:, gdy pozycja kamery na urządzeniuGMSMapViewjest nieaktywna, i określa odpowiednią pozycję kamery. W tym momencie wszystkie animacje i gesty zostaną zatrzymane.Aplikacje mogą używać tego zdarzenia do odświeżania znaczników lub innych treści wyświetlanych na
GMSMapView, zamiast np. przeładowywać treści przy każdej zmianie kamery.
Na przykład aplikacja może wyczyścić GMSMapView w trakcie ruchu, a następnie przeprowadzić geokodowanie zwrotne pozycji, w 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
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 ważnych miejsc;
Domyślnie ciekawe miejsca pojawiają się na mapie bazowej wraz z odpowiednimi ikonami. Wśród ważnych miejsc znajdują się parki, szkoły, budynki rządowe i inne obiekty, a także ważne miejsca związane z firmami, takie jak sklepy, restauracje i hotele.
Możesz odpowiadać na zdarzenia kliknięcia w przypadku punktu POI. Zapoznaj się z przewodnikiem po firmach i innych ważnych miejscach.
Inne zdarzenia
Pełną listę metod w przypadku GMSMapViewDelegate znajdziesz w przewodniku.