Wydarzenia

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 zmiana kamery czy kliknięcie znacznika.

Wstęp

Aby nasłuchiwać zdarzeń, musisz wdrożyć protokół GMSMapViewDelegate. Ten protokół zazwyczaj implementujesz 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 obiektu GMSMapView możesz wyznaczyć jego przedstawiciela do kontrolera widoku. GMSMapViewDelegate udostępnia tylko metody opcjonalne. Aby nasłuchiwać dowolnych zdarzeń, 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

Za pomocą GMSMapViewDelegate możesz nasłuchiwać zmian pozycji kamery używanych do renderowania mapy. Istnieją 3 różne zdarzenia.

  • mapView:willMove: oznacza, że pozycja kamery wkrótce się zmieni. Jeśli argument gesture ma wartość YES, oznacza to, że użytkownik wykonuje naturalny gest na elemencie GMSMapView, np. przesuwa lub przechyla. W przeciwnym razie atrybut NO oznacza, że jest to część zmiany automatycznej, np. za pomocą metod takich jak animateToCameraPosition: lub bezpośrednio aktualizowania warstwy mapy. Wartość ta może być również ustawiona na NO, jeśli użytkownik kliknie przycisk Moja lokalizacja lub przycisk kompasu, co spowoduje wygenerowanie animacji zmieniających aparat.

    Ta metoda może być wywoływana kilka razy przed wywołaniem funkcji mapView:idleAtCameraPosition:, ale zwykle dzieje się tak tylko wtedy, gdy animacje i gesty są wykonywane w tym samym czasie. Gest na przykład anuluje bieżącą animację i wywoła metodę mapView:willMove: po raz drugi.

  • Funkcja mapView:didChangeCameraPosition: jest wywoływana wielokrotnie podczas gestu lub animacji, zawsze po wywołaniu mapView:willMove:. Jest ona przekazywana do pośredniego położenia kamery.

  • Na koniec funkcja mapView:idleAtCameraPosition: jest wywoływana, gdy pozycja kamery na GMSMapView stanie się bezczynna, i określi odpowiednie położenie kamery. Od tego momentu wszystkie animacje i gesty zostały zatrzymane.

    Aplikacje mogą używać tego zdarzenia do wywołania odświeżania znaczników lub innych treści wyświetlanych w GMSMapView, zamiast na przykład ponownie wczytywać treści po każdej zmianie kamery.

Aplikacja może na przykład wyczyścić pole GMSMapView podczas ruchu, a następnie przetworzyć dane geograficzne odwrotne do pozycji, na której spoczywa 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 innych ciekawych miejscach

Domyślnie ciekawe miejsca (POI) są wyświetlane na mapie podstawowej wraz z odpowiednimi ikonami. Ważne miejsca obejmują parki, szkoły, budynki administracji publicznej i inne miejsca, a także miejsca związane z biznesem, takie jak sklepy, restauracje i hotele.

Możesz odpowiadać na zdarzenia kliknięcia związane z ważnym miejscem. Zobacz przewodnik po firmach i innych ciekawych miejscach.

Inne zdarzenia

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