Используя 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
, если пользователь нажал кнопки «Моё местоположение» или «Компас», которые генерируют анимацию, изменяющую положение камеры.Этот метод может быть вызван несколько раз, прежде чем будет вызван
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) отображаются на базовой карте вместе с соответствующими значками. К ним относятся парки, школы, правительственные здания и многое другое, а также коммерческие объекты, такие как магазины, рестораны и отели.
Вы можете реагировать на клики по объектам интереса. См. руководство по компаниям и другим объектам интереса .
Другие события
Полный список методов GMSMapViewDelegate
можно найти в справочном руководстве .