From 879bd06a931c2cada17e5d9fe354527bc04133cf Mon Sep 17 00:00:00 2001 From: Ian Wagner Date: Tue, 19 Mar 2024 11:31:33 +0900 Subject: [PATCH] PR fixes --- .../MapLibre/MLNMapViewCameraUpdating.swift | 1 + .../MapLibreSwiftUI/MapViewCoordinator.swift | 7 +++++-- .../MapLibreSwiftUI/StaticLocationManager.swift | 1 + .../Examples/MapControlsTests.swift | 10 ++++++++++ .../testLogoChangePosition.1.png | Bin 0 -> 82480 bytes 5 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 Tests/MapLibreSwiftUITests/Examples/__Snapshots__/MapControlsTests/testLogoChangePosition.1.png diff --git a/Sources/MapLibreSwiftUI/Extensions/MapLibre/MLNMapViewCameraUpdating.swift b/Sources/MapLibreSwiftUI/Extensions/MapLibre/MLNMapViewCameraUpdating.swift index aade5fd..7568bc2 100644 --- a/Sources/MapLibreSwiftUI/Extensions/MapLibre/MLNMapViewCameraUpdating.swift +++ b/Sources/MapLibreSwiftUI/Extensions/MapLibre/MLNMapViewCameraUpdating.swift @@ -3,6 +3,7 @@ import Foundation import MapLibre import Mockable +// NOTE: We should eventually mark the entire protocol @MainActor, but Mockable generates some unsafe code at the moment @Mockable protocol MLNMapViewCameraUpdating: AnyObject { @MainActor var userTrackingMode: MLNUserTrackingMode { get set } diff --git a/Sources/MapLibreSwiftUI/MapViewCoordinator.swift b/Sources/MapLibreSwiftUI/MapViewCoordinator.swift index 58dca04..d242491 100644 --- a/Sources/MapLibreSwiftUI/MapViewCoordinator.swift +++ b/Sources/MapLibreSwiftUI/MapViewCoordinator.swift @@ -54,6 +54,10 @@ public class MapViewCoordinator: NSObject { } suppressCameraUpdatePropagation = true + defer { + suppressCameraUpdatePropagation = false + } + switch camera.state { case let .centered(onCoordinate: coordinate, zoom: zoom, pitch: pitch, direction: direction): mapView.userTrackingMode = .none @@ -92,7 +96,6 @@ public class MapViewCoordinator: NSObject { } snapshotCamera = camera - suppressCameraUpdatePropagation = false } // MARK: - Coordinator API - Styles + Layers @@ -247,7 +250,7 @@ extension MapViewCoordinator: MLNMapViewDelegate { return } - // FIXME: CI complains about this being unavailable before iOS 17, despite building on iOS 17.2... This is an epic hack to fix it for now. I can only assume this is an issue with Xcode pre-15.3 + // FIXME: CI complains about MainActor.assumeIsolated being unavailable before iOS 17, despite building on iOS 17.2... This is an epic hack to fix it for now. I can only assume this is an issue with Xcode pre-15.3 Task { @MainActor in updateParentCamera(mapView: mapView, reason: reason) } diff --git a/Sources/MapLibreSwiftUI/StaticLocationManager.swift b/Sources/MapLibreSwiftUI/StaticLocationManager.swift index d6d109e..ecee763 100644 --- a/Sources/MapLibreSwiftUI/StaticLocationManager.swift +++ b/Sources/MapLibreSwiftUI/StaticLocationManager.swift @@ -20,6 +20,7 @@ public final class StaticLocationManager: NSObject, @unchecked Sendable { } } + // TODO: Investigate what this does and document it public var headingOrientation: CLDeviceOrientation = .portrait public var lastLocation: CLLocation { diff --git a/Tests/MapLibreSwiftUITests/Examples/MapControlsTests.swift b/Tests/MapLibreSwiftUITests/Examples/MapControlsTests.swift index 06bd75d..0d087bd 100644 --- a/Tests/MapLibreSwiftUITests/Examples/MapControlsTests.swift +++ b/Tests/MapLibreSwiftUITests/Examples/MapControlsTests.swift @@ -22,6 +22,16 @@ final class MapControlsTests: XCTestCase { } } + func testLogoChangePosition() { + assertView { + MapView(styleURL: demoTilesURL) + .mapControls { + LogoView() + .position(.topLeft) + } + } + } + func testCompassOnly() { assertView { MapView(styleURL: demoTilesURL) diff --git a/Tests/MapLibreSwiftUITests/Examples/__Snapshots__/MapControlsTests/testLogoChangePosition.1.png b/Tests/MapLibreSwiftUITests/Examples/__Snapshots__/MapControlsTests/testLogoChangePosition.1.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbb8f1fa7a6ac126c89cba7b5c26fdf496a3bc6 GIT binary patch literal 82480 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
    x{4zFS~Q(K?qZ7?-i1WK4JoPD$bE<|MpR-m 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 bx1ustk=gO>Zh!$5@N+@qihBMz^WgslW|<{T literal 0 HcmV?d00001