Skip to content

Commit fcc8469

Browse files
Anatoly Petrovok-gurov
authored andcommitted
Add an example text about a custom zoom control
1 parent 96bbe62 commit fcc8469

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

app/Container.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ final class Container {
4040
return sdk.sourceFactory
4141
},
4242
routeEditorSourceFactory: { [sdk = self.sdk] routeEditor in
43-
return RouteEditorSource(context: sdk.context, routeEditor: routeEditor)
43+
return sdk.sourceFactory.createRouteEditorSource(routeEditor: routeEditor)
4444
},
4545
routeEditorFactory: { [sdk = self.sdk] in
4646
return RouteEditor(context: sdk.context)
@@ -52,8 +52,8 @@ final class Container {
5252
mapFactory.mapView
5353
},
5454
customZoomControlFactory: {
55-
[sdk = self.sdk] in
56-
CustomZoomControl(map: sdk.map)
55+
[mapFactory = self.mapFactory] in
56+
CustomZoomControl(map: mapFactory.map)
5757
},
5858
mapControlFactory: self.mapFactory.mapControlFactory
5959
)

app/Map/CustomZoomControl.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public final class CustomZoomControl: UIControl {
77
private let stack: UIStackView
88

99
init(map: Map) {
10-
let model = createZoomControlModel(map: map)
10+
let model = ZoomControlModel(map: map)
1111

1212
let zoomIn = ZoomButton(model: model, direction: .zoomIn)
1313
let zoomInImage = UIImage(systemName: "plus.magnifyingglass")

docs/ru/examples.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,3 +463,66 @@ private func tap(point: ScreenPoint, tapRadius: ScreenDistance) {
463463
self.getRenderedObjectsCancellable = cancel
464464
}
465465
```
466+
467+
## Создание кнопки управления масштабом
468+
469+
В SDK есть готовый к использованию блок управления масштабом, создаваемый
470+
с помощью метода `PlatformSDK.Container.mapControlFactory.makeZoomControl()`.
471+
472+
Пример описывает создание собственной кнопки управления масштабом в фиксированном
473+
направлении: `direction` указывает, будет кнопка уменьшать или увеличивать.
474+
Ударживание кнопки в нажатом состоянии продолжает непрерывное изменение
475+
масштаба. Когда предел будет достигнут — кнопка визуально изменит состояние.
476+
477+
Из двух таких кнопок можно собрать блок свободного управления масштабом.
478+
479+
Экземпляр `ZoomControlModel` можно получить с помощью функции
480+
`PlatformSDK.createZoomControlModel(map:)`.
481+
482+
```
483+
final class ZoomButton: UIButton {
484+
private let model: ZoomControlModel
485+
private let direction: ZoomControlButton
486+
private var connection: ICancellable = NoopCancellable()
487+
488+
init(model: ZoomControlModel, direction: ZoomControlButton) {
489+
self.model = model
490+
self.direction = direction
491+
492+
super.init(frame: .zero)
493+
494+
self.addTarget(
495+
self,
496+
action: #selector(self.startZoom),
497+
for: .touchDown
498+
)
499+
self.addTarget(
500+
self,
501+
action: #selector(self.stopZoom),
502+
for: [.touchCancel, .touchUpInside, .touchUpOutside]
503+
)
504+
505+
// Реагируем на отключение действия — выключаем кнопку.
506+
// Такое возможно при достижении предела изменения масштаба.
507+
self.connection = self.model.isEnabled(button: self.direction).sink {
508+
[weak self] isEnabled in
509+
DispatchQueue.main.async {
510+
self?.isEnabled = isEnabled
511+
}
512+
}
513+
}
514+
515+
@available(*, unavailable)
516+
required init?(coder: NSCoder) {
517+
fatalError("init(coder:) has not been implemented")
518+
}
519+
520+
@objc private func startZoom() {
521+
self.model.setPressed(button: self.direction, value: true)
522+
}
523+
524+
@objc private func stopZoom() {
525+
self.model.setPressed(button: self.direction, value: false)
526+
}
527+
}
528+
```

0 commit comments

Comments
 (0)