Zdarzenia

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Wybierz platformę: Android iOS JavaScript

Korzystając z pakietu Maps SDK na iOS, możesz nasłuchiwać zdarzeń występujących na mapie, takich jak zdarzenia zmiany kamery lub zdarzenia kliknięcia znacznika.

Wprowadzenie

Aby nasłuchiwać zdarzeń, musisz wdrożyć protokół GMSMapViewDelegate. Zwykle trzeba go wdrożyć 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 GMSMapView możesz ustawić przekazywanie dostępu do kontrolera widoku danych. GMSMapViewDelegate udostępnia tylko opcjonalne metody. Aby nasłuchiwać konkretnego zdarzenia, musisz wdrożyć 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

Korzystając z funkcji GMSMapViewDelegate, możesz nasłuchiwać 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 argument gesture ma wartość YES, jest to spowodowane naturalnym gestem GMSMapView, takim jak przesunięcie lub pochylenie. W innym przypadku element NO wskazuje, że jest to część zmiany automatycznej – na przykład korzystając z metod takich jak animateToCameraPosition: lub bezpośrednio aktualizuje warstwę mapy. Może to być też NO, jeśli użytkownik kliknie przycisk Moja lokalizacja lub kompas, co spowoduje wygenerowanie animacji zmieniającej aparat.

    Ta metoda może być wywoływana kilka razy przed wywołaniem metody mapView:idleAtCameraPosition:, choć zwykle dzieje się tak tylko w przypadku wystąpienia animacji i gestu w tym samym czasie. Gwarantuje to na przykład anulowanie aktualnej animacji i ponowne wywołanie metody mapView:willMove:.

  • mapView:didChangeCameraPosition: jest wywoływany wielokrotnie podczas gestu lub animacji, zawsze po wywołaniu elementu mapView:willMove:. Przekazywany jest w pozycji pośredniej.

  • Metoda mapView:idleAtCameraPosition: jest wywoływana, gdy pozycja kamery w lokalizacji GMSMapView jest nieaktywna i określa odpowiednią pozycję kamery. Na tym etapie wszystkie animacje i gesty zostały zatrzymane.

    Dzięki niemu aplikacje mogą odświeżać znaczniki lub inne treści wyświetlane w GMSMapView, a nie np. ponownie wczytywać treści po każdej zmianie w kamerze.

Aplikacja może na przykład wyczyścić pole GMSMapView w ruchu, a potem odwrócić położenie geograficzne, na którym kamera będzie działać.

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 związane z firmami i innymi ciekawymi miejscami

Domyślnie ciekawe miejsca są wyświetlane na mapie podstawowej wraz z odpowiednimi ikonami. Ciekawe miejsca obejmują parki, szkoły, budynki rządowe oraz inne ważne miejsca, takie jak sklepy, restauracje i hotele.

Możesz odpowiadać na zdarzenia kliknięć w ważnych miejscach. Przeczytaj przewodnik po firmach i innych ciekawych miejscach.

Inne zdarzenia

Pełną listę metod dostępnych w GMSMapViewDelegate znajdziesz w przewodniku.