Мероприятия

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

Используя 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) вместе с соответствующими значками. К точкам интереса относятся парки, школы, правительственные здания и многое другое, а также коммерческие объекты, такие как магазины, рестораны и отели.

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

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

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