From ab2a1efa9a2196b45c64dd6eb91fbec17861e34f Mon Sep 17 00:00:00 2001 From: masashi Date: Tue, 1 Sep 2026 11:41:47 +0900 Subject: [PATCH 1/6] Make bearing a clockwise map rotation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bearing を「値を増やすと地図が時計回りに回る」向きに統一し、ネイティブ SDK との変換をコアの CameraBearing に集約する。 --- .../MapCameraPositionExtensions.swift | 8 ++++---- .../controller/MapKitViewController.swift | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/MapConductorForMapKit/MapCameraPositionExtensions.swift b/Sources/MapConductorForMapKit/MapCameraPositionExtensions.swift index e39a96c..fe52392 100644 --- a/Sources/MapConductorForMapKit/MapCameraPositionExtensions.swift +++ b/Sources/MapConductorForMapKit/MapCameraPositionExtensions.swift @@ -1,6 +1,6 @@ import Foundation import MapKit -import MapConductorCore +@_spi(MapConductorDriver) import MapConductorCore private let converter = MapKitZoomAltitudeConverter(zoom0Altitude: 171_319_879.0) private let mapKitMaxPitch: Double = 80.9 @@ -30,7 +30,7 @@ public extension MapCameraPosition { ? Spherical.computeOffset( origin: position, distance: distance * tan(pitchRadians), - heading: bearing + heading: CameraBearing.toNativeHeading(bearing) ) : position @@ -42,7 +42,7 @@ public extension MapCameraPosition { ), fromDistance: distance, pitch: nativePitch, - heading: bearing + heading: CameraBearing.toNativeHeading(bearing) ) } } @@ -95,7 +95,7 @@ public extension MKMapView { return MapCameraPosition( position: position, zoom: zoom, - bearing: camera.heading, + bearing: CameraBearing.bearingFromNativeHeading(camera.heading), tilt: logicalTilt, visibleRegion: visibleRegion ) diff --git a/Sources/MapConductorForMapKit/controller/MapKitViewController.swift b/Sources/MapConductorForMapKit/controller/MapKitViewController.swift index dbb0f02..02bdbea 100644 --- a/Sources/MapConductorForMapKit/controller/MapKitViewController.swift +++ b/Sources/MapConductorForMapKit/controller/MapKitViewController.swift @@ -1,7 +1,7 @@ import Foundation import CoreLocation import MapKit -import MapConductorCore +@_spi(MapConductorDriver) import MapConductorCore import QuartzCore import UIKit @@ -228,12 +228,12 @@ final class MapKitViewController: MapViewControllerProtocol { // Use UIView.animate to respect the specified duration UIView.animate(withDuration: duration) { mapView.setVisibleMapRect(rect, edgePadding: .zero, animated: false) - Self.applyHeading(position.bearing, center: centerCoordinate, to: mapView, animated: false) + Self.applyHeading(CameraBearing.toNativeHeading(position.bearing), center: centerCoordinate, to: mapView, animated: false) } } else { // Use MapKit's default animation or no animation mapView.setVisibleMapRect(rect, edgePadding: .zero, animated: animated) - Self.applyHeading(position.bearing, center: centerCoordinate, to: mapView, animated: animated) + Self.applyHeading(CameraBearing.toNativeHeading(position.bearing), center: centerCoordinate, to: mapView, animated: animated) } return true From df51ead5d752d3bc2eaf2b45ad7685da12ed82ae Mon Sep 17 00:00:00 2001 From: masashi Date: Thu, 3 Sep 2026 17:16:23 +0900 Subject: [PATCH 2/6] ci: build MapConductorCore from the matching branch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit コアの未リリースな変更に追随する PR を、コアのリリースを待たずに検証できるようにする。Package.swift が元から持っている「隣に ios-sdk-core があればそれを使う」経路に乗せるだけ。 --- .github/workflows/build.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 19fd7f2..875c12a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,6 +32,25 @@ jobs: - name: Show toolchain run: xcodebuild -version && swift --version + # Package.swift は `../ios-sdk-core` があればそれを使い、無ければ released 版 + # (`from: "1.1.4"`)へ解決する。CI はこのリポジトリしか checkout しないので + # 常に released 版になり、**コアの未リリースな変更に追随する PR は永久に赤いまま** + # になっていた(CameraBearing をコアへ足したときに踏んだ)。 + # 隣に置いてローカル開発と同じ経路に乗せる。同名ブランチがあればそちらを使う。 + - name: Check out MapConductorCore next to this package + env: + HEAD_REF: ${{ github.head_ref }} + run: | + url=https://github.com/MapConductor/ios-sdk-core.git + if [ -n "$HEAD_REF" ] && git ls-remote --exit-code --heads "$url" "$HEAD_REF" >/dev/null 2>&1; then + echo "ios-sdk-core: matching branch $HEAD_REF" + git clone --depth 1 --branch "$HEAD_REF" "$url" ../ios-sdk-core + else + echo "ios-sdk-core: default branch" + git clone --depth 1 "$url" ../ios-sdk-core + fi + test -f ../ios-sdk-core/Package.swift + - name: Build run: | scheme=$(sed -n 's/^[[:space:]]*name: "\([^"]*\)".*/\1/p' Package.swift | head -1) From d8e7f0b7b0c27feba80a766da815c38f157a6246 Mon Sep 17 00:00:00 2001 From: masashi Date: Thu, 3 Sep 2026 17:28:47 +0900 Subject: [PATCH 3/6] fix: make the CGFloat pitch conversion explicit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MKMapCamera.pitch は CGFloat。暗黙変換に任せると CoreGraphics の cos(CGFloat) と Foundation の cos(Double) が両方候補になり、ツールチェーンによっては ambiguous use of 'cos' で落ちる。 --- .../MapCameraPositionExtensions.swift | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Sources/MapConductorForMapKit/MapCameraPositionExtensions.swift b/Sources/MapConductorForMapKit/MapCameraPositionExtensions.swift index fe52392..b740503 100644 --- a/Sources/MapConductorForMapKit/MapCameraPositionExtensions.swift +++ b/Sources/MapConductorForMapKit/MapCameraPositionExtensions.swift @@ -54,7 +54,11 @@ public extension MKMapView { visibleRegion: VisibleRegion? = nil ) -> MapCameraPosition { let cameraAltitude = camera.altitude - let pitchRadians = camera.pitch * .pi / 180.0 + // `MKMapCamera.pitch` は CGFloat。CGFloat と Double の暗黙変換に任せると + // CoreGraphics の `cos(CGFloat)` と Foundation の `cos(Double)` が両方候補になり、 + // ツールチェーンによっては `ambiguous use of 'cos'` で落ちる(CI の macos-15 で踏んだ)。 + // 手元の Xcode では通ってしまうので、Double へ明示的に寄せておく。 + let pitchRadians = Double(camera.pitch) * .pi / 180.0 // Recover the slant distance set via MKMapCamera(fromDistance:) — the inverse of toMKMapCamera(). let slantDistance = cameraAltitude / max(cos(pitchRadians), minCosTilt) var position = GeoPoint( @@ -154,7 +158,11 @@ private extension MKMapView { /// from whatever camera happens to be set and reused to place the next one. func metersPerPointPerDistance() -> Double? { guard let metersPerPoint = measuredMetersPerPointAtCenter() else { return nil } - let pitchRadians = camera.pitch * .pi / 180.0 + // `MKMapCamera.pitch` は CGFloat。CGFloat と Double の暗黙変換に任せると + // CoreGraphics の `cos(CGFloat)` と Foundation の `cos(Double)` が両方候補になり、 + // ツールチェーンによっては `ambiguous use of 'cos'` で落ちる(CI の macos-15 で踏んだ)。 + // 手元の Xcode では通ってしまうので、Double へ明示的に寄せておく。 + let pitchRadians = Double(camera.pitch) * .pi / 180.0 let slantDistance = camera.altitude / max(cos(pitchRadians), minCosTilt) guard slantDistance > 0 else { return nil } let factor = metersPerPoint / slantDistance From 60fa824d0979bcc4583a1e3bdc6f0d5c879b621e Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Mon, 21 Sep 2026 22:40:52 +0900 Subject: [PATCH 4/6] Reject a re-sent identical marker list at the door SwiftUI re-evaluates map content on every camera change and hands the full marker list back to syncMarkers each time. For 144k markers the per-pass sets, dictionaries and hasEntity locks ran on the main thread for hundreds of milliseconds -- the 'pinch feels heavy on iOS' report. MarkerListIdentity (core) compares the list by reference and lets an unchanged list return in under a millisecond. Applied to every provider because fixing one just moves the report to the next one. Also pass declutterPx through to the tile renderer -- the option was silently ignored here while MapLibre honoured it -- and drop the per-subscription log line, which emitted 144k lines on first sync. --- .../marker/MapKitMarkerController.swift | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Sources/MapConductorForMapKit/marker/MapKitMarkerController.swift b/Sources/MapConductorForMapKit/marker/MapKitMarkerController.swift index c5d5d3b..a08b90c 100644 --- a/Sources/MapConductorForMapKit/marker/MapKitMarkerController.swift +++ b/Sources/MapConductorForMapKit/marker/MapKitMarkerController.swift @@ -1,7 +1,7 @@ import Combine import CoreLocation import MapKit -import MapConductorCore +@_spi(MapConductorDriver) import MapConductorCore @MainActor final class MapKitMarkerController: AbstractMarkerController { @@ -21,8 +21,18 @@ final class MapKitMarkerController: AbstractMarkerController Date: Sat, 10 Oct 2026 14:10:59 -0700 Subject: [PATCH 5/6] fix: account for Retina scale in MapKit raster tiles --- .../raster/MapKitRasterLayerOverlayRenderer.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Sources/MapConductorForMapKit/raster/MapKitRasterLayerOverlayRenderer.swift b/Sources/MapConductorForMapKit/raster/MapKitRasterLayerOverlayRenderer.swift index 9974a2b..845b84c 100644 --- a/Sources/MapConductorForMapKit/raster/MapKitRasterLayerOverlayRenderer.swift +++ b/Sources/MapConductorForMapKit/raster/MapKitRasterLayerOverlayRenderer.swift @@ -14,7 +14,7 @@ final class MapKitRasterLayerOverlayRenderer: AbstractRasterLayerOverlayRenderer override func createLayer(state: RasterLayerState) async -> MKTileOverlay? { guard let mapView else { return nil } - guard let overlay = await makeTileOverlay(from: state) else { return nil } + guard let overlay = await makeTileOverlay(from: state, displayScale: mapView.traitCollection.displayScale) else { return nil } overlayStates[overlay] = state let renderer = MKTileOverlayRenderer(tileOverlay: overlay) @@ -97,14 +97,18 @@ final class MapKitRasterLayerOverlayRenderer: AbstractRasterLayerOverlayRenderer mapView = nil } - private func makeTileOverlay(from state: RasterLayerState) async -> MKTileOverlay? { + private func makeTileOverlay(from state: RasterLayerState, displayScale: CGFloat) async -> MKTileOverlay? { let source = await resolveSource(state: state) switch source { case let .urlTemplate(template, tileSize, minZoom, maxZoom, _, scheme): + // RasterLayerSource expresses display size in points; MKTileOverlay + // expects pixels. Without the screen scale, Retina maps select a + // finer tile level and shrink the style's labels and road widths. + let pixelSize = max(1, Int((CGFloat(tileSize) * max(1, displayScale)).rounded())) let overlay = CustomURLTileOverlay( urlTemplate: template, - tileSize: tileSize, + tileSize: pixelSize, minZoom: minZoom, maxZoom: maxZoom, scheme: scheme, From 633a756455dd1c4bdcac455b7b598dbfee686bce Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 10 Oct 2026 14:18:54 -0700 Subject: [PATCH 6/6] feat: integrate vector style support and pending map fixes --- .../MapConductorForMapKit/MapKitMapView.swift | 18 ++++ api/MapConductorForMapKit.api.swift | 92 +++++++++---------- 2 files changed, 64 insertions(+), 46 deletions(-) diff --git a/Sources/MapConductorForMapKit/MapKitMapView.swift b/Sources/MapConductorForMapKit/MapKitMapView.swift index a5772cf..2461e97 100644 --- a/Sources/MapConductorForMapKit/MapKitMapView.swift +++ b/Sources/MapConductorForMapKit/MapKitMapView.swift @@ -9,6 +9,8 @@ public struct MapKitMapView: View { @ObservedObject private var state: MapKitViewState private let handlers: MapViewHandlers private let cameraRestriction: CameraRestriction? + private let style: MapViewStyle? + private let onStyleDiagnostics: (([String]) -> Void)? private let content: () -> MapViewContent public init( @@ -21,10 +23,18 @@ public struct MapKitMapView: View { onCameraMove: OnCameraMoveHandler? = nil, onCameraMoveEnd: OnCameraMoveHandler? = nil, sdkInitialize: (() -> Void)? = nil, + /// How the map looks, when the app states it rather than naming a + /// design. `MapConductorVectorStyle` builds one; what happens + /// underneath depends on this backend and the app does not have to + /// know. + style: MapViewStyle? = nil, + onStyleDiagnostics: (([String]) -> Void)? = nil, @MapViewContentBuilder content: @escaping () -> MapViewContent = { MapViewContent() } ) { self.state = state self.cameraRestriction = cameraRestriction + self.style = style + self.onStyleDiagnostics = onStyleDiagnostics self.handlers = MapViewHandlers( onMapLoaded: onMapLoaded, onMapClick: onMapClick, @@ -54,6 +64,8 @@ public struct MapKitMapView: View { state: state, cameraRestriction: cameraRestriction, handlers: handlers, + style: style, + onStyleDiagnostics: onStyleDiagnostics, content: mapContent ) } @@ -64,6 +76,8 @@ private struct MapKitMapViewRepresentable: UIViewRepresentable { @ObservedObject var state: MapKitViewState let cameraRestriction: CameraRestriction? let handlers: MapViewHandlers + let style: MapViewStyle? + let onStyleDiagnostics: (([String]) -> Void)? let content: MapViewContent func makeCoordinator() -> Coordinator { @@ -109,6 +123,9 @@ private struct MapKitMapViewRepresentable: UIViewRepresentable { } func updateUIView(_ uiView: MKMapView, context: Context) { + // Every evaluation of the app's `body` lands here; most calls do + // nothing. See `MapViewStyleHost.apply`. + context.coordinator.applyStyle(style, onDiagnostics: onStyleDiagnostics) // 制限値が変わったときだけ再適用する。 context.coordinator.applyCameraRestriction(cameraRestriction) uiView.mapType = state.mapDesignType.getValue() @@ -128,6 +145,7 @@ private struct MapKitMapViewRepresentable: UIViewRepresentable { } static func dismantleUIView(_ uiView: MKMapView, coordinator: Coordinator) { + coordinator.disposeStyle() coordinator.unbind() uiView.delegate = nil } diff --git a/api/MapConductorForMapKit.api.swift b/api/MapConductorForMapKit.api.swift index 2dfbbb1..b909ad1 100644 --- a/api/MapConductorForMapKit.api.swift +++ b/api/MapConductorForMapKit.api.swift @@ -12,70 +12,70 @@ import _Concurrency import _MapKit_SwiftUI import _StringProcessing import _SwiftConcurrencyShims -extension MapConductorCore.MapCameraPosition { - final public func toMKMapCamera(on mapView: MapKit.MKMapView? = nil) -> MapKit.MKMapCamera +extension MapConductorCore::MapCameraPosition { + final public func toMKMapCamera(on mapView: MapKit::MKMapView? = nil) -> MapKit::MKMapCamera } -extension MapKit.MKMapView { - @_Concurrency.MainActor @preconcurrency public func toMapCameraPosition(logicalTiltHint: Swift.Double? = nil, visibleRegion: MapConductorCore.VisibleRegion? = nil) -> MapConductorCore.MapCameraPosition +extension MapKit::MKMapView { + @_Concurrency::MainActor @preconcurrency public func toMapCameraPosition(logicalTiltHint: Swift::Double? = nil, visibleRegion: MapConductorCore::VisibleRegion? = nil) -> MapConductorCore::MapCameraPosition } -public protocol MapKitMapDesignTypeProtocol : MapConductorCore.MapDesignTypeProtocol where Self.Identifier == MapKit.MKMapType { +public protocol MapKitMapDesignTypeProtocol : MapConductorCore::MapDesignTypeProtocol where Self.Identifier == MapKit::MKMapType { } -public typealias MapKitMapDesignType = any MapConductorForMapKit.MapKitMapDesignTypeProtocol -public struct MapKitMapDesign : MapConductorForMapKit.MapKitMapDesignTypeProtocol, Swift.Hashable { - public let id: MapKit.MKMapType - public let attributionRules: [MapConductorCore.AttributionRule] - public init(id: MapKit.MKMapType, attributionRules: [MapConductorCore.AttributionRule] = []) - public func getValue() -> MapKit.MKMapType - public static let Standard: MapConductorForMapKit.MapKitMapDesign - public static let Satellite: MapConductorForMapKit.MapKitMapDesign - public static let Hybrid: MapConductorForMapKit.MapKitMapDesign - public static let SatelliteFlyover: MapConductorForMapKit.MapKitMapDesign - public static let HybridFlyover: MapConductorForMapKit.MapKitMapDesign - public static let MutedStandard: MapConductorForMapKit.MapKitMapDesign - public static func Create(id: MapKit.MKMapType) -> MapConductorForMapKit.MapKitMapDesign - public static func toMapDesignType(id: MapKit.MKMapType) -> MapConductorForMapKit.MapKitMapDesignType - public static func == (a: MapConductorForMapKit.MapKitMapDesign, b: MapConductorForMapKit.MapKitMapDesign) -> Swift.Bool - public typealias Identifier = MapKit.MKMapType - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public typealias MapKitMapDesignType = any MapConductorForMapKit::MapKitMapDesignTypeProtocol +public struct MapKitMapDesign : MapConductorForMapKit::MapKitMapDesignTypeProtocol, Swift::Hashable { + public let id: MapKit::MKMapType + public let attributionRules: [MapConductorCore::AttributionRule] + public init(id: MapKit::MKMapType, attributionRules: [MapConductorCore::AttributionRule] = []) + public func getValue() -> MapKit::MKMapType + public static let Standard: MapConductorForMapKit::MapKitMapDesign + public static let Satellite: MapConductorForMapKit::MapKitMapDesign + public static let Hybrid: MapConductorForMapKit::MapKitMapDesign + public static let SatelliteFlyover: MapConductorForMapKit::MapKitMapDesign + public static let HybridFlyover: MapConductorForMapKit::MapKitMapDesign + public static let MutedStandard: MapConductorForMapKit::MapKitMapDesign + public static func Create(id: MapKit::MKMapType) -> MapConductorForMapKit::MapKitMapDesign + public static func toMapDesignType(id: MapKit::MKMapType) -> MapConductorForMapKit::MapKitMapDesignType + public static func == (a: MapConductorForMapKit::MapKitMapDesign, b: MapConductorForMapKit::MapKitMapDesign) -> Swift::Bool + public typealias Identifier = MapKit::MKMapType + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } -@_Concurrency.MainActor @preconcurrency public struct MapKitMapView : SwiftUICore.View { - @_Concurrency.MainActor @preconcurrency public init(state: MapConductorForMapKit.MapKitViewState, cameraRestriction: MapConductorCore.CameraRestriction? = nil, onMapLoaded: MapConductorCore.OnMapLoadedHandler? = nil, onMapClick: MapConductorCore.OnMapEventHandler? = nil, onMapLongClick: MapConductorCore.OnMapEventHandler? = nil, onCameraMoveStart: MapConductorCore.OnCameraMoveHandler? = nil, onCameraMove: MapConductorCore.OnCameraMoveHandler? = nil, onCameraMoveEnd: MapConductorCore.OnCameraMoveHandler? = nil, sdkInitialize: (() -> Swift.Void)? = nil, @MapConductorCore.MapViewContentBuilder content: @escaping () -> MapConductorCore.MapViewContent = { MapViewContent() }) - @_Concurrency.MainActor @preconcurrency public var body: some SwiftUICore.View { +@_Concurrency::MainActor @preconcurrency public struct MapKitMapView : SwiftUICore::View { + @_Concurrency::MainActor @preconcurrency public init(state: MapConductorForMapKit::MapKitViewState, cameraRestriction: MapConductorCore::CameraRestriction? = nil, onMapLoaded: MapConductorCore::OnMapLoadedHandler? = nil, onMapClick: MapConductorCore::OnMapEventHandler? = nil, onMapLongClick: MapConductorCore::OnMapEventHandler? = nil, onCameraMoveStart: MapConductorCore::OnCameraMoveHandler? = nil, onCameraMove: MapConductorCore::OnCameraMoveHandler? = nil, onCameraMoveEnd: MapConductorCore::OnCameraMoveHandler? = nil, sdkInitialize: (() -> Swift::Void)? = nil, style: (any MapConductorCore::MapViewStyle)? = nil, onStyleDiagnostics: (([Swift::String]) -> Swift::Void)? = nil, @MapConductorCore::MapViewContentBuilder content: @escaping () -> MapConductorCore::MapViewContent = { MapViewContent() }) + @_Concurrency::MainActor @preconcurrency public var body: some SwiftUICore::View { get } public typealias Body = @_opaqueReturnTypeOf("$s015MapConductorForA3Kit0adA4ViewV4bodyQrvp", 0) __ } -public typealias MapKitActualMarker = MapKit.MKPointAnnotation -public typealias MapKitActualPolyline = MapKit.MKPolyline -public typealias MapKitActualCircle = MapKit.MKCircle -public typealias MapKitActualPolygon = MapKit.MKPolygon -final public class MapKitViewState : MapConductorCore.MapViewState { - final public var mapViewHolder: MapConductorForMapKit.MapKitViewHolder? { +public typealias MapKitActualMarker = MapKit::MKPointAnnotation +public typealias MapKitActualPolyline = MapKit::MKPolyline +public typealias MapKitActualCircle = MapKit::MKCircle +public typealias MapKitActualPolygon = MapKit::MKPolygon +final public class MapKitViewState : MapConductorCore::MapViewState { + final public var mapViewHolder: MapConductorForMapKit::MapKitViewHolder? { get } - override final public var mapDesignType: MapConductorForMapKit.MapKitMapDesignType { + override final public var mapDesignType: MapConductorForMapKit::MapKitMapDesignType { get set } - public init(id: Swift.String, mapDesignType: MapConductorForMapKit.MapKitMapDesignType = MapKitMapDesign.Standard, cameraPosition: MapConductorCore.MapCameraPosition = .Default, uiSettings: MapConductorCore.MapUISettings = MapUISettings()) - convenience public init(mapDesignType: MapConductorForMapKit.MapKitMapDesignType = MapKitMapDesign.Standard, cameraPosition: MapConductorCore.MapCameraPosition = .Default, uiSettings: MapConductorCore.MapUISettings = MapUISettings()) - override final public func getMapViewHolder() -> MapConductorCore.AnyMapViewHolder? + public init(id: Swift::String, mapDesignType: MapConductorForMapKit::MapKitMapDesignType = MapKitMapDesign.Standard, cameraPosition: MapConductorCore::MapCameraPosition = .Default, uiSettings: MapConductorCore::MapUISettings = MapUISettings()) + convenience public init(mapDesignType: MapConductorForMapKit::MapKitMapDesignType = MapKitMapDesign.Standard, cameraPosition: MapConductorCore::MapCameraPosition = .Default, uiSettings: MapConductorCore::MapUISettings = MapUISettings()) + override final public func getMapViewHolder() -> MapConductorCore::AnyMapViewHolder? @objc deinit } -public class MapKitZoomAltitudeConverter : MapConductorCore.WebMercatorZoomAltitudeConverter { - public init(zoom0Altitude: Swift.Double = AbstractZoomAltitudeConverter.defaultZoom0Altitude) +public class MapKitZoomAltitudeConverter : MapConductorCore::WebMercatorZoomAltitudeConverter { + public init(zoom0Altitude: Swift::Double = AbstractZoomAltitudeConverter.defaultZoom0Altitude) @objc deinit } -@_hasMissingDesignatedInitializers final public class MapKitViewHolder : MapConductorCore.MapViewHolderProtocol { - final public let mapView: MapKit.MKMapView - final public let map: MapKit.MKMapView - final public func toScreenOffset(position: any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint? - final public func fromScreenOffsetSync(offset: CoreFoundation.CGPoint) -> MapConductorCore.GeoPoint? - public typealias ActualMap = MapKit.MKMapView - public typealias ActualMapView = MapKit.MKMapView +@_hasMissingDesignatedInitializers final public class MapKitViewHolder : MapConductorCore::MapViewHolderProtocol { + final public let mapView: MapKit::MKMapView + final public let map: MapKit::MKMapView + final public func toScreenOffset(position: any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint? + final public func fromScreenOffsetSync(offset: CoreFoundation::CGPoint) -> MapConductorCore::GeoPoint? + public typealias ActualMap = MapKit::MKMapView + public typealias ActualMapView = MapKit::MKMapView @objc deinit } -extension MapConductorForMapKit.MapKitMapView : Swift.Sendable {} +extension MapConductorForMapKit::MapKitMapView : Swift::Sendable {}