Zdarzenia

Wybierz platformę: Android iOS JavaScript

Korzystając z pakietu SDK Map Google na iOS, możesz nasłuchiwać zdarzeń występujących na mapie, takich jak zmiana kamery lub dotknięcie znacznika.

Wstęp

Aby nasłuchiwać zdarzeń, musisz wdrożyć protokół GMSMapViewDelegate. Zwykle wdraża się go 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 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

GMSMapViewDelegate umożliwia nasłuchiwanie zmian pozycji kamery użytej do renderowania mapy. Wyróżniamy 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 urządzeniu GMSMapView, taki jak przesuwanie czy przechylanie. W przeciwnym razie NO wskazuje, że jest to część zmiany automatycznej, np. przez metodę animateToCameraPosition: lub bezpośrednią aktualizację warstwy mapy. To może być również wartość NO, jeśli użytkownik kliknął przycisk Moja lokalizacja lub przycisk kompasu, które generują animacje zmieniające sposób działania kamery.

    Tę metodę można wywołać kilka razy przed wywołaniem funkcji mapView:idleAtCameraPosition:. Zwykle odbywa się to tylko wtedy, gdy animacje i gesty występują w tym samym czasie – gest spowoduje na przykład anulowanie bieżącej animacji i wywołanie mapView:willMove: po raz drugi.

  • Parametr mapView:didChangeCameraPosition: jest wywoływany wielokrotnie podczas gestu lub animacji, zawsze po wywołaniu do mapView:willMove:. Jest przekazywany w pozycję pośredniej kamery.

  • Wreszcie funkcja mapView:idleAtCameraPosition: jest wywoływana, gdy pozycja kamery na urządzeniu GMSMapView stanie się bezczynna, i określi odpowiednie położenie kamery. Wszystkie animacje i gesty zostały wstrzymane.

    Aplikacje mogą używać tego zdarzenia do 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ć dane GMSMapView w ruchu, a następnie odwrócić położenie geograficzne, w którym znajduje 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 związane z firmami i innymi ciekawymi miejscami

Domyślnie ciekawe miejsca (POI) są wyświetlane na mapie podstawowej wraz z odpowiadającymi im ikonami. Ważne miejsca to między innymi parki, szkoły i budynki administracji, a także ważne miejsca biznesowe, takie jak sklepy, restauracje i hotele.

Możesz odpowiadać na kliknięcia ważnych miejsc. Zapoznaj się z przewodnikiem po firmach i innych ciekawych miejscach.

Inne zdarzenia

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