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 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 można 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 obiektu GMSMapView możesz wyznaczyć przedstawiciela, który będzie nim zarządzać. GMSMapViewDelegate udostępnia tylko metody opcjonalne. 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 w pozycji kamery używanej do renderowania mapy. Są 3 różne zdarzenia.

  • mapView:willMove: oznacza, że pozycja kamery niedługo się zmieni. Jeśli argument gesture ma wartość YES, jest to spowodowane naturalnym gestem użytkownika GMSMapView, takim jak przesunięcie lub przechylenie. W przeciwnym razie NO wskazuje, że jest to zmiana automatyczna – na przykład metodą animateToCameraPosition: lub można bezpośrednio zaktualizować warstwę mapy. Wartość może też być NO, jeśli użytkownik kliknął przycisk Moja lokalizacja lub kompas, które generują animacje zmieniające kamerę.

    Tę metodę można wywołać kilka razy przed wywołaniem mapView:idleAtCameraPosition:, ale zwykle dzieje się tak tylko wtedy, gdy w tym samym czasie występują animacje i gesty – gest anuluje wszystkie bieżące animacje i wywoła mapView:willMove: drugi raz.

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

  • Na koniec wywołania mapView:idleAtCameraPosition: są wywoływane, gdy położenie kamery na urządzeniu GMSMapView jest nieaktywne i określa odpowiednią pozycję kamery. W tym momencie wszystkie animacje i gesty są zatrzymane.

    Aplikacje mogą używać tego zdarzenia do odświeżania odświeżania znaczników lub innych treści na ekranie GMSMapView, zamiast 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 spoczywać.

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 na mapie podstawowej wyświetlane są ciekawe miejsca wraz z odpowiednimi ikonami. Ciekawe miejsca obejmują parki, szkoły, budynki rządowe i inne, a także ważne miejsca biznesowe, 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 znajdziesz na GMSMapViewDelegate w przewodniku.