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