Используя 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
, смотрите справочное руководство .