События

Выберите платформу: Android iOS JavaScript

Используя Maps SDK для iOS, вы можете прослушивать события, происходящие на карте, например события смены камеры или события касания маркера.

Введение

Чтобы прослушивать события, необходимо реализовать протокол GMSMapViewDelegate . Обычно этот протокол реализуется на контроллере представления, отображающем карту. Ниже приведен пример:

Быстрый

import GoogleMaps

class Events: UIViewController, GMSMapViewDelegate {
  // ...
}
      

Цель-C

@import GoogleMaps;

@interface Events : UIViewController <GMSMapViewDelegate>

@end
      

Когда GMSMapView создан, вы можете установить его делегата в свой контроллер представления. GMSMapViewDelegate предоставляет только необязательные методы. Чтобы прослушать какое-либо конкретное событие, необходимо реализовать соответствующий метод.

Быстрый

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)")
}
      

Цель-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);
}
      

Положение камеры

Используя GMSMapViewDelegate , вы можете прослушивать изменения положения камеры, используемой для визуализации карты. Есть три различных события.

  • mapView:willMove: указывает, что положение камеры вот-вот изменится. Если для аргумента gesture установлено значение YES , это связано с тем, что пользователь выполняет естественный жест в GMSMapView , например панорамирование или наклон. В противном случае NO указывает, что это часть программного изменения — например, с помощью таких методов, как animateToCameraPosition: или непосредственного обновления слоя карты. Это также может быть NO , если пользователь нажал кнопки «Мое местоположение» или «Компас», которые генерируют анимацию, меняющую камеру.

    Этот метод может вызываться несколько раз перед вызовом mapView:idleAtCameraPosition: хотя обычно это происходит только в том случае, если анимация и жесты происходят одновременно — например, жест отменит любую текущую анимацию и вызовет mapView:willMove: секунду. время.

  • mapView:didChangeCameraPosition: вызывается неоднократно во время жеста или анимации, всегда после вызова mapView:willMove: . Ему передается промежуточное положение камеры.

  • Наконец, mapView:idleAtCameraPosition: вызывается, когда положение камеры в GMSMapView становится неактивным, и определяет соответствующее положение камеры. На этом этапе все анимации и жесты остановились.

    Приложения могут использовать это событие для запуска обновления маркеров или другого содержимого, отображаемого в GMSMapView , вместо того, чтобы, например, перезагружать содержимое при каждой смене камеры.

Например, приложение может очищать GMSMapView при движении, а затем обратно геокодировать положение, в котором остановилась камера.

Быстрый

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
      }
    }
  }
      

Цель-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];
}
      

Деловые мероприятия и другие интересные места

По умолчанию точки интереса (POI) отображаются на базовой карте вместе с соответствующими значками. К POI относятся парки, школы, правительственные здания и т. д., а также бизнес-POI, например магазины, рестораны и отели.

Вы можете реагировать на события кликов в POI. См. путеводитель по предприятиям и другим достопримечательностям .

Другие события

Чтобы узнать о полном списке методов GMSMapViewDelegate , смотрите справочное руководство .