Wydarzenia

Wybierz platformę: Android iOS JavaScript

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 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. Wyróżniamy 3 różne zdarzenia.

  • mapView:willMove: wskazuje, że pozycja kamery ma się zmienić. Jeśli argument gesture jest ustawiony na YES, oznacza to, że użytkownik wykonuje naturalny gest na GMSMapView, np. przesuwa lub przechyla mapę. W przeciwnym razie NO wskazuje, że jest to część zmiany programowej – na przykład za pomocą metod takich jak animateToCameraPosition: lub bezpośredniej aktualizacji warstwy mapy. Może to być też 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 metoda mapView:idleAtCameraPosition:, ale zwykle dzieje się tak tylko wtedy, gdy animacje i gesty występują w tym samym czasie – na przykład gest anuluje bieżącą animację i wywoła metodę mapView:willMove: po raz drugi.

  • mapView:didChangeCameraPosition: jest wywoływana wielokrotnie podczas gestu lub animacji, zawsze po wywołaniu mapView:willMove:. Przekazuje ona pośrednią pozycję kamery.

  • Na koniec, gdy pozycja kamery w GMSMapView stanie się bezczynna, wywoływana jest metoda mapView:idleAtCameraPosition:, która określa odpowiednią pozycję kamery. W tym momencie 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, zamiast np. przeładowywać treści przy każdej zmianie kamery.

Na przykład aplikacja może wyczyścić GMSMapView podczas ruchu, a następnie przeprowadzić geokodowanie odwrotne 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];
}
      

Zdarzenia dotyczące firm i innych ważnych miejsc

Domyślnie ważne miejsca (POI) są wyświetlane na mapie podstawowej wraz z odpowiadającymi im ikonami. Do ważnych miejsc należą parki, szkoły, budynki rządowe i inne miejsca, a także ważne miejsca związane z firmami, takie jak sklepy, restauracje i hotele.

Możesz reagować na zdarzenia kliknięcia w ważne miejsce. Zapoznaj się z przewodnikiem po firmach i innych ważnych miejscach.

Inne zdarzenia

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