Zdarzenia

Wybierz platformę: Android iOS JavaScript

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 argument gesture ma wartość YES, wynika to z tego, że użytkownik wykonuje gest naturalny w GMSMapView, taki jak przesunięcie lub przechylenie. W przeciwnym razie NO wskazuje, że jest to część zmiany automatycznej – na przykład metody takie jak animateToCameraPosition: 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 po mapView:willMove:.

  • mapView:didChangeCameraPosition: jest wywoływany wielokrotnie podczas gestu lub animacji, zawsze po wywołaniu funkcji mapView:willMove:. Jest ono przekazywane do pozycji kamery pośredniej.

  • Na koniec mapView:idleAtCameraPosition: jest wywoływany, gdy pozycja kamery w stanie GMSMapView 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.