Используя 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
, если пользователь нажал на кнопки My Location или Compass, которые генерируют анимацию, изменяющую камеру.Этот метод может быть вызван несколько раз, прежде чем будет вызван
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 } } }
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 относятся парки, школы, правительственные здания и многое другое, а также деловые POI, такие как магазины, рестораны и отели.
Вы можете реагировать на события щелчка на POI. Смотрите руководство по предприятиям и другим точкам интереса .
Другие события
Полный список методов GMSMapViewDelegate
можно найти в справочном руководстве .