diff --git a/Sources/MapLibreSwiftDSL/Style Layers/Background.swift b/Sources/MapLibreSwiftDSL/Style Layers/Background.swift index 0f9e104..e5d4ec5 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/Background.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/Background.swift @@ -9,8 +9,8 @@ public struct BackgroundLayer: StyleLayer { public let identifier: String public var insertionPosition: LayerInsertionPosition = .below(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public init(identifier: String) { self.identifier = identifier diff --git a/Sources/MapLibreSwiftDSL/Style Layers/Circle.swift b/Sources/MapLibreSwiftDSL/Style Layers/Circle.swift index 6026212..9e6794a 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/Circle.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/Circle.swift @@ -12,8 +12,8 @@ public struct CircleStyleLayer: SourceBoundVectorStyleLayerDefinition { public let sourceLayerIdentifier: String? public var insertionPosition: LayerInsertionPosition = .above(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public var source: StyleLayerSource public var predicate: NSPredicate? diff --git a/Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift b/Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift index f610c27..c6b9a47 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift @@ -12,8 +12,8 @@ public struct FillStyleLayer: SourceBoundVectorStyleLayerDefinition { public let sourceLayerIdentifier: String? public var insertionPosition: LayerInsertionPosition = .above(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public var source: StyleLayerSource public var predicate: NSPredicate? diff --git a/Sources/MapLibreSwiftDSL/Style Layers/Line.swift b/Sources/MapLibreSwiftDSL/Style Layers/Line.swift index 6e50dfd..5286c8d 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/Line.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/Line.swift @@ -14,8 +14,8 @@ public struct LineStyleLayer: SourceBoundVectorStyleLayerDefinition { public let sourceLayerIdentifier: String? public var insertionPosition: LayerInsertionPosition = .above(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public var source: StyleLayerSource public var predicate: NSPredicate? diff --git a/Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift b/Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift index 779753a..f898780 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift @@ -29,8 +29,8 @@ public struct SymbolStyleLayer: SourceBoundVectorStyleLayerDefinition { public let sourceLayerIdentifier: String? public var insertionPosition: LayerInsertionPosition = .above(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public var source: StyleLayerSource public var predicate: NSPredicate? diff --git a/Sources/MapLibreSwiftUI/Examples/Camera.swift b/Sources/MapLibreSwiftUI/Examples/Camera.swift index a7f0f11..10bb005 100644 --- a/Sources/MapLibreSwiftUI/Examples/Camera.swift +++ b/Sources/MapLibreSwiftUI/Examples/Camera.swift @@ -5,8 +5,8 @@ struct CameraDirectManipulationPreview: View { @State private var camera = MapViewCamera.center(switzerland, zoom: 4) let styleURL: URL - var onStyleLoaded: (() -> Void)? = nil - var targetCameraAfterDelay: MapViewCamera? = nil + var onStyleLoaded: (() -> Void)? + var targetCameraAfterDelay: MapViewCamera? var body: some View { MapView(styleURL: styleURL, camera: $camera) diff --git a/Sources/MapLibreSwiftUI/MapView.swift b/Sources/MapLibreSwiftUI/MapView.swift index 7fb338b..49ad063 100644 --- a/Sources/MapLibreSwiftUI/MapView.swift +++ b/Sources/MapLibreSwiftUI/MapView.swift @@ -33,6 +33,7 @@ public struct MapView: UIViewControllerRepresentab var gestures = [MapGesture]() var onStyleLoaded: ((MLNStyle) -> Void)? + var onUserTrackingModeChanged: ((MLNUserTrackingMode, Bool) -> Void)? var onViewProxyChanged: ((MapViewProxy) -> Void)? var proxyUpdateMode: ProxyUpdateMode? @@ -105,6 +106,9 @@ public struct MapView: UIViewControllerRepresentab // Link the style loaded to the coordinator that emits the delegate event. context.coordinator.onStyleLoaded = onStyleLoaded + // Link the user tracking change to the coordinator that emits the delegate event. + context.coordinator.onUserTrackingModeChange = onUserTrackingModeChanged + // Add all gesture recognizers for gesture in gestures { registerGesture(controller.mapView, context, gesture: gesture) diff --git a/Sources/MapLibreSwiftUI/MapViewCoordinator.swift b/Sources/MapLibreSwiftUI/MapViewCoordinator.swift index 9240b05..c33c70d 100644 --- a/Sources/MapLibreSwiftUI/MapViewCoordinator.swift +++ b/Sources/MapLibreSwiftUI/MapViewCoordinator.swift @@ -44,6 +44,7 @@ MLNMapViewDelegate { var cameraUpdateContinuation: CheckedContinuation? var onStyleLoaded: ((MLNStyle) -> Void)? + var onUserTrackingModeChange: ((MLNUserTrackingMode, Bool) -> Void)? var onGesture: (MLNMapView, UIGestureRecognizer) -> Void var onViewProxyChanged: (MapViewProxy) -> Void var proxyUpdateMode: ProxyUpdateMode @@ -438,6 +439,10 @@ MLNMapViewDelegate { } } + public func mapView(_: MLNMapView, didChange mode: MLNUserTrackingMode, animated: Bool) { + onUserTrackingModeChange?(mode, animated) + } + // MARK: MapViewProxy @MainActor private func updateViewProxy(mapView: MLNMapView, reason: MLNCameraChangeReason) { diff --git a/Sources/MapLibreSwiftUI/MapViewModifiers.swift b/Sources/MapLibreSwiftUI/MapViewModifiers.swift index ddba764..4ecd5c1 100644 --- a/Sources/MapLibreSwiftUI/MapViewModifiers.swift +++ b/Sources/MapLibreSwiftUI/MapViewModifiers.swift @@ -14,6 +14,12 @@ public extension MapView { return newMapView } + func onUserTrackingModeChanged(_ perform: @escaping (MLNUserTrackingMode, Bool) -> Void) -> MapView { + var newMapView = self + newMapView.onUserTrackingModeChanged = perform + return newMapView + } + /// Allows you to set properties of the underlying MLNMapView directly /// in cases where these have not been ported to DSL yet. /// Use this function to modify various properties of the MLNMapView instance.