From fcc8469d945e526cbe534c7b91f7049c6e22dcb4 Mon Sep 17 00:00:00 2001 From: Anatoly Petrov Date: Wed, 17 Mar 2021 22:51:39 +0700 Subject: [PATCH] Add an example text about a custom zoom control --- app/Container.swift | 6 ++-- app/Map/CustomZoomControl.swift | 2 +- docs/ru/examples.md | 63 +++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/app/Container.swift b/app/Container.swift index e4cfaf6..fb724ea 100644 --- a/app/Container.swift +++ b/app/Container.swift @@ -40,7 +40,7 @@ final class Container { return sdk.sourceFactory }, routeEditorSourceFactory: { [sdk = self.sdk] routeEditor in - return RouteEditorSource(context: sdk.context, routeEditor: routeEditor) + return sdk.sourceFactory.createRouteEditorSource(routeEditor: routeEditor) }, routeEditorFactory: { [sdk = self.sdk] in return RouteEditor(context: sdk.context) @@ -52,8 +52,8 @@ final class Container { mapFactory.mapView }, customZoomControlFactory: { - [sdk = self.sdk] in - CustomZoomControl(map: sdk.map) + [mapFactory = self.mapFactory] in + CustomZoomControl(map: mapFactory.map) }, mapControlFactory: self.mapFactory.mapControlFactory ) diff --git a/app/Map/CustomZoomControl.swift b/app/Map/CustomZoomControl.swift index b6aa39a..b4d276c 100644 --- a/app/Map/CustomZoomControl.swift +++ b/app/Map/CustomZoomControl.swift @@ -7,7 +7,7 @@ public final class CustomZoomControl: UIControl { private let stack: UIStackView init(map: Map) { - let model = createZoomControlModel(map: map) + let model = ZoomControlModel(map: map) let zoomIn = ZoomButton(model: model, direction: .zoomIn) let zoomInImage = UIImage(systemName: "plus.magnifyingglass") diff --git a/docs/ru/examples.md b/docs/ru/examples.md index f86e468..acc3f64 100644 --- a/docs/ru/examples.md +++ b/docs/ru/examples.md @@ -463,3 +463,66 @@ private func tap(point: ScreenPoint, tapRadius: ScreenDistance) { self.getRenderedObjectsCancellable = cancel } ``` + +## Создание кнопки управления масштабом + +В SDK есть готовый к использованию блок управления масштабом, создаваемый +с помощью метода `PlatformSDK.Container.mapControlFactory.makeZoomControl()`. + +Пример описывает создание собственной кнопки управления масштабом в фиксированном +направлении: `direction` указывает, будет кнопка уменьшать или увеличивать. +Ударживание кнопки в нажатом состоянии продолжает непрерывное изменение +масштаба. Когда предел будет достигнут — кнопка визуально изменит состояние. + +Из двух таких кнопок можно собрать блок свободного управления масштабом. + +Экземпляр `ZoomControlModel` можно получить с помощью функции +`PlatformSDK.createZoomControlModel(map:)`. + +``` +final class ZoomButton: UIButton { + private let model: ZoomControlModel + private let direction: ZoomControlButton + private var connection: ICancellable = NoopCancellable() + + init(model: ZoomControlModel, direction: ZoomControlButton) { + self.model = model + self.direction = direction + + super.init(frame: .zero) + + self.addTarget( + self, + action: #selector(self.startZoom), + for: .touchDown + ) + self.addTarget( + self, + action: #selector(self.stopZoom), + for: [.touchCancel, .touchUpInside, .touchUpOutside] + ) + + // Реагируем на отключение действия — выключаем кнопку. + // Такое возможно при достижении предела изменения масштаба. + self.connection = self.model.isEnabled(button: self.direction).sink { + [weak self] isEnabled in + DispatchQueue.main.async { + self?.isEnabled = isEnabled + } + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc private func startZoom() { + self.model.setPressed(button: self.direction, value: true) + } + + @objc private func stopZoom() { + self.model.setPressed(button: self.direction, value: false) + } +} +```