Korzystając z pakietu SDK Map na iOS, możesz nasłuchiwać zdarzeń występujących na mapie, np. zdarzeń zmiany aparatu lub zdarzeń kliknięcia znacznika.
Wprowadzenie
Aby nasłuchiwać zdarzeń, musisz wdrożyć protokół GMSMapViewDelegate
. Zwykle należy wdrożyć ten protokół na 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 elementu GMSMapView
możesz przekazać dostęp do niego swojemu kontrolerowi widoku. GMSMapViewDelegate
zawiera 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
GMSMapViewDelegate
umożliwia nasłuchiwanie zmian w pozycji kamery używanej do renderowania mapy. Są 3 różne zdarzenia.
mapView:willMove:
oznacza, że położenie kamery wkrótce się zmieni. Jeśli argumentgesture
ma wartośćYES
, wynika to z tego, że użytkownik wykonuje gest naturalny wGMSMapView
, taki jak przesunięcie lub przechylenie. W przeciwnym razieNO
wskazuje, że jest to część zmiany automatycznej – na przykład metody takie jakanimateToCameraPosition:
lub bezpośrednia aktualizacja warstwy mapy. Może to też być wartośćNO
, jeśli użytkownik kliknął przycisk Moja lokalizacja lub kompas, co spowodowało wygenerowanie animacji zmieniającej aparat.Tę metodę można wywołać kilka razy przed wywołaniem
mapView:idleAtCameraPosition:
, ale zwykle dzieje się tak, jeśli w tym samym czasie występują animacje i gesty – gest anuluje np. bieżącą animację i wywoła ją ponownie pomapView:willMove:
.mapView:didChangeCameraPosition:
jest wywoływany wielokrotnie podczas gestu lub animacji, zawsze po wywołaniu funkcjimapView:willMove:
. Jest ono przekazywane do pozycji kamery pośredniej.Na koniec
mapView:idleAtCameraPosition:
jest wywoływany, gdy pozycja kamery w stanieGMSMapView
jest nieaktywna i określa odpowiednie położenie kamery. Na tym etapie wszystkie animacje i gesty zostały zatrzymane.Aplikacje mogą używać tego zdarzenia do wywoływania odświeżania znaczników lub innych treści wyświetlanych w
GMSMapView
, bez konieczności np. ponownego ładowania treści przy każdej zmianie kamery.
Aplikacja może na przykład wyczyścić pole GMSMapView
w ruchu, a potem odwrócić dane geograficzne, na których opiera 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 w firmach i inne ciekawe miejsca
Domyślnie ciekawe miejsca są wyświetlane na mapie podstawowej wraz z odpowiednimi ikonami. Do ważnych miejsc należą parki, szkoły, budynki administracji publicznej oraz inne ważne miejsca, takie jak sklepy, restauracje i hotele.
Możesz odpowiadać na zdarzenia kliknięcia w danym miejscu. Zobacz przewodnik po firmach i innych ciekawych miejscach.
Inne zdarzenia
Pełną listę metod, które zawiera GMSMapViewDelegate
, znajdziesz w przewodniku.