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