Мероприятия

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

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

Введение

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

Быстрый

import GoogleMaps

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

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

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

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

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

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

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

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

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

    Приложения могут использовать это событие для запуска обновления маркеров или другого содержимого, отображаемого на 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
      }
    }
  }
      

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

Мероприятия, посвященные бизнесу и другим интересным местам

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

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

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

Полный список методов GMSMapViewDelegate можно найти в справочном руководстве .