Maps SDK для iOS позволяет прослушивать события на карте, например перемещение камеры или нажатие на маркер.
Введение
Чтобы отслеживать события, необходимо реализовать протокол GMSMapViewDelegate. Обычно этот протокол реализуется в контроллере представления, который отображает карту. Пример:
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
Objective-C
@import GoogleMaps; @interface Events : UIViewController <GMSMapViewDelegate> @end
После создания GMSMapView вы можете назначить его делегатом контроллера представления. GMSMapViewDelegate предоставляет только необязательные методы. Чтобы прослушивать определенное событие, необходимо реализовать соответствующий метод.
Swift
override func loadView() { super.loadView() let camera = GMSCameraPosition.camera( withLatitude: 1.285, longitude: 103.848, zoom: 12 ) let options = GMSMapViewOptions() options.camera = camera let mapView = GMSMapView(options: options) 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]; GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = camera; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; 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 при перемещении, а затем выполнять обратное геокодирование положения, в котором камера останавливается.
Swift
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
static 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]; }
События, связанные с организациями и другими объектами
По умолчанию достопримечательности отображаются на базовой карте вместе с соответствующими им значками. К достопримечательностям относятся парки, школы, правительственные здания и прочие объекты, а также коммерческие организации, такие как магазины, рестораны и гостиницы.
Вы можете обрабатывать события кликов для объектов. Подробнее о том, как это делать, рассказывается в руководстве по взаимодействию с организациями и объекты инфраструктуры.
Другие события
Полный список методов GMSMapViewDelegate приведен в справочном руководстве.