From 8948a9fc315149f9c2b437b9bd1b809c098d5f46 Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 9 Sep 2025 01:55:57 +0800 Subject: [PATCH 1/5] Fix visionOS compile and link issue --- Example/Example.xcodeproj/project.pbxproj | 20 +++-- Example/Example/BenchmarkApp.swift | 6 +- Example/HostingExample/AppDelegate.swift | 2 +- Example/HostingExample/SceneDelegate.swift | 2 +- Example/HostingExample/ViewController.swift | 4 +- ...rmViewControllerRepresentableUITests.swift | 4 +- .../PlatformViewRepresentableUITests.swift | 4 +- .../Extension/Color+Platform.swift | 4 +- .../ColorRepresentableExample.swift | 6 +- Package.swift | 2 +- .../UIKit/OpenSwiftUI+UIApplication.h | 4 +- .../UIKit/OpenSwiftUI+UIApplication.m | 4 +- .../COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.h | 4 +- .../COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.m | 2 +- .../UIKit/OpenSwiftUITesting_Swizzles+UIKit.h | 4 +- .../UIKit/OpenSwiftUITesting_Swizzles+UIKit.m | 6 +- .../UIKit/OpenSwiftUITesting_Swizzles.h | 4 +- .../UIKit/OpenSwiftUITesting_Swizzles.m | 6 +- Sources/OpenSwiftUI/App/AppDelegate.swift | 4 +- .../App/FinishLaunchTestAction.swift | 4 +- .../App/OpenSwiftUIApplication.swift | 8 +- .../Environment/PlatformEnvironment.swift | 4 +- .../Event/UIKit/UIKitEventBindingBridge.swift | 2 +- .../KeyboardShortcut/EventModifiers.swift | 2 +- .../TODO/KeyboardShortcut.swift | 2 +- .../Color/KitCoreUINamedColorProvider.swift | 6 +- .../AppKit/NSViewPlatformViewDefinition.swift | 0 .../Controller/UIHostingController.swift | 2 +- .../UIHostingControllerSizingOptions.swift | 2 +- .../Hosting/UIKit/UIHostingViewable.swift | 2 +- .../UIKit/UIViewPlatformViewDefinition.swift | 78 ++++++++++++++++++- .../Hosting/UIKit/View/AnyUIHostingView.swift | 2 +- .../Hosting/UIKit/View/UIGraphicsView.swift | 29 ------- .../Hosting/UIKit/View/UIHostingView.swift | 12 ++- .../UIKit/View/UIHostingViewBase.swift | 13 +++- .../UIKit/View/UIHostingViewDebugLayer.swift | 2 +- .../Hosting/UIKit/View/UIInheritedView.swift | 35 --------- .../UIKit/View/UIViewControllerProvider.swift | 2 +- .../Platform/PlatformViewHost.swift | 16 ++-- .../Platform/PlatformViewRepresentable.swift | 2 +- .../Platform/SafeAreaHelper.swift | 2 +- .../UIKit/UIViewControllerRepresentable.swift | 2 +- .../UIKit/UIViewRepresentable.swift | 2 +- .../OpenSwiftUI/Test/PerformanceTest.swift | 8 +- .../OpenSwiftUI/Test/TestingAppDelegate.swift | 4 +- .../Test/TestingSceneDelegate.swift | 2 +- Sources/OpenSwiftUI/Test/ViewTest.swift | 10 +-- .../OpenSwiftUI/Util/OpenSwiftUIGlue.swift | 8 +- .../View/Control/Link/OpenURLActionKey.swift | 4 +- Sources/OpenSwiftUI/View/Toggle/Switch.swift | 2 +- .../CoreAnimation/CAFrameRateRangeUtil.swift | 2 +- .../DisplayListViewPlatform.swift} | 4 + .../View/Extension/View_Opacity.swift | 42 ---------- .../CAFrameRateRangeUtil+TestSub.c | 2 +- .../Integration/PlatformAlias.swift | 2 +- .../PlatformHostingControllerHelper.swift | 4 +- .../OpenSwiftUITargetConditionals.h | 2 + .../CoreGraphics/OpenSwiftUICoreColor.h | 2 +- .../OpenSwiftUICorePlatformImage.m | 2 +- .../CoreGraphics/OpenSwiftUICoreView.h | 10 +++ .../CoreGraphics/OpenSwiftUICoreView.m | 15 +++- .../CoreUI/CoreUI+UIUserInterfaceIdiom.h | 4 +- .../CoreUI/CoreUI+UIUserInterfaceIdiom.m | 60 +++++++------- .../Shims/UIKit/UIKit_Private.h | 1 + ...dentifiedViewProxyCompatibilityTests.swift | 4 +- .../CAFrameRateRangeUtilTests.swift | 2 +- .../Semantic/SemanticsTests.swift | 2 +- .../CAFrameRateRangeUtilDualTests.swift | 2 +- .../EnvironmentValuesOpenURLTests.swift | 2 +- .../Environment/UIKitEnvironmentTests.swift | 2 +- .../UIKit/View/UIHostingViewBaseTests.swift | 2 +- .../IdentifiedViewTreeTests.swift | 2 +- .../View/ViewAliasTests.swift | 4 +- .../CoreGraphics/CorePlatformImageTests.swift | 4 +- .../Shims/CoreFoundationPrivateTests.swift | 2 +- .../Shims/DyldPrivateTests.swift | 6 +- 76 files changed, 287 insertions(+), 260 deletions(-) rename Sources/OpenSwiftUI/Integration/{Render => Hosting}/AppKit/NSViewPlatformViewDefinition.swift (100%) rename Sources/OpenSwiftUI/Integration/{Render => Hosting}/UIKit/UIViewPlatformViewDefinition.swift (52%) delete mode 100644 Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIGraphicsView.swift delete mode 100644 Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIInheritedView.swift rename Sources/OpenSwiftUICore/Render/{PlatformViewDefinition.swift => DisplayList/DisplayListViewPlatform.swift} (93%) delete mode 100644 Sources/OpenSwiftUICore/View/Extension/View_Opacity.swift diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj index 3e05d925f..1870db6e6 100644 --- a/Example/Example.xcodeproj/project.pbxproj +++ b/Example/Example.xcodeproj/project.pbxproj @@ -559,12 +559,13 @@ PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = NO; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 2.0; }; name = OpenSwiftUIDebug; }; @@ -964,12 +965,13 @@ PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = NO; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 2.0; }; name = SwiftUIRelease; }; @@ -1087,12 +1089,13 @@ PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = NO; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 2.0; }; name = OpenSwiftUIRelease; }; @@ -1300,12 +1303,13 @@ PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = NO; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 2.0; }; name = SwiftUIDebug; }; diff --git a/Example/Example/BenchmarkApp.swift b/Example/Example/BenchmarkApp.swift index bc1ae3b7d..ec297021d 100644 --- a/Example/Example/BenchmarkApp.swift +++ b/Example/Example/BenchmarkApp.swift @@ -12,7 +12,7 @@ import OpenSwiftUI import SwiftUI #endif -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #endif @@ -24,7 +24,7 @@ struct BenchmarkApp { ]) } } -#if os(iOS) +#if os(iOS) || os(visionOS) extension UIHostingController: _Test where Content == AnyView {} extension UIHostingController: _ViewTest where Content == AnyView { public func initRootView() -> AnyView { @@ -46,7 +46,7 @@ struct PerformanceTest: _PerformanceTest { } func runTest(host: _BenchmarkHost, options: [AnyHashable : Any]) { - #if os(iOS) + #if os(iOS) || os(visionOS) let test = _makeUIHostingController(view) as! UIHostingController test.setUpTest() test.render() diff --git a/Example/HostingExample/AppDelegate.swift b/Example/HostingExample/AppDelegate.swift index cd7f3f402..68e4cdb27 100644 --- a/Example/HostingExample/AppDelegate.swift +++ b/Example/HostingExample/AppDelegate.swift @@ -5,7 +5,7 @@ // Created by Kyle on 2024/3/17. // -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit diff --git a/Example/HostingExample/SceneDelegate.swift b/Example/HostingExample/SceneDelegate.swift index 825537e2d..8edd5b2fc 100644 --- a/Example/HostingExample/SceneDelegate.swift +++ b/Example/HostingExample/SceneDelegate.swift @@ -5,7 +5,7 @@ // Created by Kyle on 2024/3/17. // -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit diff --git a/Example/HostingExample/ViewController.swift b/Example/HostingExample/ViewController.swift index 77fadfd40..357d59c6e 100644 --- a/Example/HostingExample/ViewController.swift +++ b/Example/HostingExample/ViewController.swift @@ -11,13 +11,13 @@ import OpenSwiftUI import SwiftUI #endif -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #elseif os(macOS) import AppKit #endif -#if os(iOS) +#if os(iOS) || os(visionOS) class ViewController: UINavigationController { override func viewDidAppear(_ animated: Bool) { pushViewController(EntryViewController(), animated: false) diff --git a/Example/OpenSwiftUIUITests/Integration/Representable/PlatformViewControllerRepresentableUITests.swift b/Example/OpenSwiftUIUITests/Integration/Representable/PlatformViewControllerRepresentableUITests.swift index 9794ec8b9..15c41ee2a 100644 --- a/Example/OpenSwiftUIUITests/Integration/Representable/PlatformViewControllerRepresentableUITests.swift +++ b/Example/OpenSwiftUIUITests/Integration/Representable/PlatformViewControllerRepresentableUITests.swift @@ -5,7 +5,7 @@ import Testing import SnapshotTesting -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias PlatformViewControllerRepresentable = UIViewControllerRepresentable #elseif os(macOS) @@ -19,7 +19,7 @@ struct PlatformViewControllerRepresentableUITests { @Test func plainColorView() { struct PlainColorView: PlatformViewControllerRepresentable { - #if os(iOS) + #if os(iOS) || os(visionOS) func makeUIViewController(context: Context) -> some UIViewController { let vc = UIViewController() vc.view.backgroundColor = .red diff --git a/Example/OpenSwiftUIUITests/Integration/Representable/PlatformViewRepresentableUITests.swift b/Example/OpenSwiftUIUITests/Integration/Representable/PlatformViewRepresentableUITests.swift index 774812e47..ad3d94e7a 100644 --- a/Example/OpenSwiftUIUITests/Integration/Representable/PlatformViewRepresentableUITests.swift +++ b/Example/OpenSwiftUIUITests/Integration/Representable/PlatformViewRepresentableUITests.swift @@ -5,7 +5,7 @@ import Testing import SnapshotTesting -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias PlatformViewRepresentable = UIViewRepresentable #elseif os(macOS) @@ -19,7 +19,7 @@ struct PlatformViewRepresentableUITests { @Test func plainColorView() { struct PlainColorView: PlatformViewRepresentable { - #if os(iOS) + #if os(iOS) || os(visionOS) func makeUIView(context: Context) -> some UIView { let v = UIView() v.backgroundColor = .red diff --git a/Example/SharedExample/Extension/Color+Platform.swift b/Example/SharedExample/Extension/Color+Platform.swift index 5b65b4cf1..59f0770f7 100644 --- a/Example/SharedExample/Extension/Color+Platform.swift +++ b/Example/SharedExample/Extension/Color+Platform.swift @@ -11,7 +11,7 @@ import OpenSwiftUI import SwiftUI #endif -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias PlatformColor = UIColor #elseif os(macOS) @@ -21,7 +21,7 @@ typealias PlatformColor = NSColor extension Color { init(platformColor: PlatformColor) { - #if os(iOS) + #if os(iOS) || os(visionOS) self.init(uiColor: platformColor) #elseif os(macOS) self.init(nsColor: platformColor) diff --git a/Example/SharedExample/Integration/Representable/ColorRepresentableExample.swift b/Example/SharedExample/Integration/Representable/ColorRepresentableExample.swift index d100f0d7d..1d2024481 100644 --- a/Example/SharedExample/Integration/Representable/ColorRepresentableExample.swift +++ b/Example/SharedExample/Integration/Representable/ColorRepresentableExample.swift @@ -8,7 +8,7 @@ import OpenSwiftUI import SwiftUI #endif -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias PlatformViewRepresentable = UIViewRepresentable typealias PlatformViewControllerRepresentable = UIViewControllerRepresentable @@ -19,7 +19,7 @@ typealias PlatformViewControllerRepresentable = NSViewControllerRepresentable #endif struct ColorViewRepresentableExample: PlatformViewRepresentable { - #if os(iOS) + #if os(iOS) || os(visionOS) func makeUIView(context: Context) -> some UIView { let v = UIView() v.backgroundColor = .red @@ -40,7 +40,7 @@ struct ColorViewRepresentableExample: PlatformViewRepresentable { } struct ColorViewControllerRepresentableExample: PlatformViewControllerRepresentable { - #if os(iOS) + #if os(iOS) || os(visionOS) func makeUIViewController(context: Context) -> some UIViewController { let vc = UIViewController() vc.view.backgroundColor = .red diff --git a/Package.swift b/Package.swift index fb48c53e3..af049a8c8 100644 --- a/Package.swift +++ b/Package.swift @@ -604,7 +604,7 @@ extension [SwiftSetting] { /// setting availability definitions, which was added in /// [swift#65218](https://github.com/swiftlang/swift/pull/65218). fileprivate static func availabilityMacroSettings(ignoreAvailability: Bool) -> Self { - let minimumVersion = "iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0" + let minimumVersion = "iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, visionOS 1.0" return [ .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v1_0:\(ignoreAvailability ? minimumVersion : "iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0")"), .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v1_4:\(ignoreAvailability ? minimumVersion : "iOS 13.4, macOS 10.15.4, tvOS 13.4, watchOS 6.2")"), diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIApplication.h b/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIApplication.h index 54a12f50e..a3f2ad6b6 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIApplication.h +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIApplication.h @@ -10,7 +10,7 @@ #include "OpenSwiftUIBase.h" -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION #import @@ -21,6 +21,6 @@ UIContentSizeCategory _UIApplicationDefaultContentSizeCategory(); OPENSWIFTUI_ASSUME_NONNULL_END -#endif /* OPENSWIFTUI_TARGET_OS_IOS */ +#endif /* OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION */ #endif /* OpenSwiftUI_UIApplication_h */ diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIApplication.m b/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIApplication.m index d481bb69c..754ce892f 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIApplication.m +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIApplication.m @@ -7,7 +7,7 @@ #include "OpenSwiftUI+UIApplication.h" -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION #include UIContentSizeCategory _UIApplicationDefaultContentSizeCategory() { @@ -24,4 +24,4 @@ UIContentSizeCategory _UIApplicationDefaultContentSizeCategory() { return func(UIApplication.class, selector); } -#endif /* OPENSWIFTUI_TARGET_OS_IOS */ +#endif /* OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION */ diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.h b/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.h index 91e60ba10..2cff3f162 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.h +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.h @@ -10,7 +10,7 @@ #include "OpenSwiftUIBase.h" -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION #import @@ -28,6 +28,6 @@ BOOL _UIColorDependsOnTraitCollection(UIColor *color); OPENSWIFTUI_ASSUME_NONNULL_END -#endif /* OPENSWIFTUI_TARGET_OS_IOS */ +#endif /* OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION */ #endif /* OpenSwiftUI_UIColor_h */ diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.m b/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.m index adb3c3c52..38a4cf634 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.m +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUI+UIColor.m @@ -7,7 +7,7 @@ #import "OpenSwiftUI+UIColor.h" -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION BOOL _UIColorDependsOnTraitCollection(UIColor *color) { static IMP UIColor_imp = nil; diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.h b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.h index 55888e56e..06d0cd24f 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.h +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.h @@ -10,7 +10,7 @@ #include "OpenSwiftUIBase.h" -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION #include OPENSWIFTUI_ASSUME_NONNULL_BEGIN @@ -28,6 +28,6 @@ OPENSWIFTUI_ASSUME_NONNULL_BEGIN OPENSWIFTUI_ASSUME_NONNULL_END -#endif /* OPENSWIFTUI_TARGET_OS_IOS */ +#endif /* OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION */ #endif /* OpenSwiftUITesting_Swizzles_UIKit_h */ diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.m b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.m index 6478d2a5b..5595b90c5 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.m +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.m @@ -8,8 +8,9 @@ #include "OpenSwiftUITesting_Swizzles+UIKit.h" #include "OpenSwiftUITesting_Swizzles.h" -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION +#if !OPENSWIFTUI_TARGET_OS_VISION @implementation UIScreen (OpenSwiftUITesting_Swizzles) + (void)_performOpenSwiftUITestingOverrides { _SwizzleMethods(UIScreen.class, @selector(scale), @selector(_OpenSwiftUITesting_currentScreenScale)); @@ -24,10 +25,13 @@ - (BOOL)_OpenSwiftUITesting_wantsWideContentMargins { return NO; } @end +#endif @implementation UICollectionView (OpenSwiftUITesting_Swizzles) + (void)_performOpenSwiftUITestingOverrides { + #if !OPENSWIFTUI_TARGET_OS_VISION _SwizzleMethods(UIScreen.class, @selector(_viewAnimationsForCurrentUpdateWithCollectionViewAnimator:), @selector(_OpenSwiftUITesting__viewAnimationsForCurrentUpdateWithCollectionViewAnimator:)); + #endif } - (id)_OpenSwiftUITesting__viewAnimationsForCurrentUpdateWithCollectionViewAnimator:(id)arg1 { diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.h b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.h index 75c64917e..6af958b7f 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.h +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.h @@ -12,7 +12,7 @@ OPENSWIFTUI_ASSUME_NONNULL_BEGIN -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION OPENSWIFTUI_EXPORT void _PerformTestingSwizzles(); @@ -20,7 +20,7 @@ void _PerformTestingSwizzles(); OPENSWIFTUI_EXPORT void _SwizzleMethods(Class class, SEL originalSelector, SEL swizzledSelector); -#endif /* OPENSWIFTUI_TARGET_OS_IOS */ +#endif /* OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION */ OPENSWIFTUI_ASSUME_NONNULL_END diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.m b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.m index e7f6c7b88..475371501 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.m +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.m @@ -7,14 +7,16 @@ #include "OpenSwiftUITesting_Swizzles.h" -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION #include #include "UIKit/OpenSwiftUITesting_Swizzles+UIKit.h" void _PerformTestingSwizzles() { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ + #if !OPENSWIFTUI_TARGET_OS_VISION [UIScreen _performOpenSwiftUITestingOverrides]; + #endif [UICollectionView _performOpenSwiftUITestingOverrides]; }); } @@ -34,4 +36,4 @@ void _SwizzleMethods(Class class, SEL originalSelector, SEL swizzledSelector) { } } -#endif /* OPENSWIFTUI_TARGET_OS_IOS */ +#endif /* OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION */ diff --git a/Sources/OpenSwiftUI/App/AppDelegate.swift b/Sources/OpenSwiftUI/App/AppDelegate.swift index d7383d7e8..893265896 100644 --- a/Sources/OpenSwiftUI/App/AppDelegate.swift +++ b/Sources/OpenSwiftUI/App/AppDelegate.swift @@ -6,7 +6,7 @@ // Status: WIP // ID: 4475FD12FD59DEBA453321BD91F6EA04 -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias DelegateBaseClass = UIResponder typealias PlatformApplication = UIApplication @@ -25,7 +25,7 @@ typealias PlatformApplicationDelegate = AnyObject #endif class AppDelegate: DelegateBaseClass { - #if os(iOS) + #if os(iOS) || os(visionOS) var fallbackDelegate: UIApplicationDelegate? // WIP diff --git a/Sources/OpenSwiftUI/App/FinishLaunchTestAction.swift b/Sources/OpenSwiftUI/App/FinishLaunchTestAction.swift index 92477b9af..52c7ac895 100644 --- a/Sources/OpenSwiftUI/App/FinishLaunchTestAction.swift +++ b/Sources/OpenSwiftUI/App/FinishLaunchTestAction.swift @@ -5,7 +5,7 @@ // Audited for iOS 15.5 // Status: Complete -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #elseif os(macOS) import AppKit @@ -14,7 +14,7 @@ import AppKit struct FinishLaunchTestAction { func callAsFunction() { AppGraph.shared?.stopProfilingIfNecessary() - #if os(iOS) + #if os(iOS) || os(visionOS) UIApplication.shared.finishedTest(UIApplication.shared._launchTestName()) #else preconditionFailure("Unimplemented for other platform") diff --git a/Sources/OpenSwiftUI/App/OpenSwiftUIApplication.swift b/Sources/OpenSwiftUI/App/OpenSwiftUIApplication.swift index 5164a9444..4273ac346 100644 --- a/Sources/OpenSwiftUI/App/OpenSwiftUIApplication.swift +++ b/Sources/OpenSwiftUI/App/OpenSwiftUIApplication.swift @@ -8,7 +8,7 @@ @_spi(ForOpenSwiftUIOnly) import OpenSwiftUICore -#if os(iOS) || os(tvOS) +#if os(iOS) || os(visionOS) || os(tvOS) import UIKit private final class OpenSwiftUIApplication: UIApplication { @objc override init() { @@ -45,7 +45,7 @@ func runApp(_ app: some App) -> Never { // MARK: - runTestingApp [6.4.41] [iOS] func runTestingApp(rootView: V1, comparisonView: V2, didLaunch: @escaping (any TestHost, any TestHost) -> ()) -> Never where V1: View, V2: View { - #if os(iOS) + #if os(iOS) || os(visionOS) TestingSceneDelegate.connectCallback = { (window: UIWindow, comparisonWindow: UIWindow) in CoreTesting.isRunning = true let rootVC = UIHostingController(rootView: rootView) @@ -71,13 +71,13 @@ private func KitRendererCommon(_ delegateType: AnyObject.Type) -> Never { let closure = { (argv: UnsafeMutablePointer?>) in let argc = CommandLine.argc #if canImport(Darwin) - #if os(iOS) || os(tvOS) || os(macOS) + #if os(iOS) || os(visionOS) || os(tvOS) || os(macOS) let principalClassName = NSStringFromClass(OpenSwiftUIApplication.self) #endif let delegateClassName = NSStringFromClass(delegateType) #endif - #if os(iOS) || os(tvOS) + #if os(iOS) || os(visionOS) || os(tvOS) let code = UIApplicationMain(argc, argv, principalClassName, delegateClassName) #elseif os(watchOS) let code = WKApplicationMain(argc, argv, delegateClassName) diff --git a/Sources/OpenSwiftUI/Data/Environment/PlatformEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/PlatformEnvironment.swift index 37f5d5b56..423c8718b 100644 --- a/Sources/OpenSwiftUI/Data/Environment/PlatformEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/PlatformEnvironment.swift @@ -7,7 +7,7 @@ import OpenSwiftUI_SPI import OpenSwiftUICore -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias TraitCollection = UITraitCollection #elseif os(macOS) @@ -52,7 +52,7 @@ extension EnvironmentValues { // resolvedTextProvider = OpenSwiftUIResolvedTextProvider.self // hasSystemOpenURLAction = true - #if os(iOS) + #if os(iOS) || os(visionOS) // bridgedEnvironmentResolver = UITraitBridgedEnvironmentResolver.self #if OPENSWIFTUI_LINK_COREUI let idiom = traitCollection?.userInterfaceIdiom ?? UIDevice.current.userInterfaceIdiom diff --git a/Sources/OpenSwiftUI/Event/Event/UIKit/UIKitEventBindingBridge.swift b/Sources/OpenSwiftUI/Event/Event/UIKit/UIKitEventBindingBridge.swift index 780a267a3..e6cc0b59f 100644 --- a/Sources/OpenSwiftUI/Event/Event/UIKit/UIKitEventBindingBridge.swift +++ b/Sources/OpenSwiftUI/Event/Event/UIKit/UIKitEventBindingBridge.swift @@ -5,7 +5,7 @@ // Audited for 6.5.4 // Status: WIP -#if os(iOS) +#if os(iOS) || os(visionOS) // FIXME package class UIKitEventBindingBridge { diff --git a/Sources/OpenSwiftUI/Event/InputEvent/KeyboardShortcut/EventModifiers.swift b/Sources/OpenSwiftUI/Event/InputEvent/KeyboardShortcut/EventModifiers.swift index f46ceb52f..19761f44a 100644 --- a/Sources/OpenSwiftUI/Event/InputEvent/KeyboardShortcut/EventModifiers.swift +++ b/Sources/OpenSwiftUI/Event/InputEvent/KeyboardShortcut/EventModifiers.swift @@ -24,7 +24,7 @@ extension EventModifiers: Sendable {} -#if os(iOS) || os(tvOS) +#if os(iOS) || os(visionOS) || os(tvOS) import UIKit extension EventModifiers { diff --git a/Sources/OpenSwiftUI/Event/InputEvent/KeyboardShortcut/TODO/KeyboardShortcut.swift b/Sources/OpenSwiftUI/Event/InputEvent/KeyboardShortcut/TODO/KeyboardShortcut.swift index ebcfc491f..202c1962b 100644 --- a/Sources/OpenSwiftUI/Event/InputEvent/KeyboardShortcut/TODO/KeyboardShortcut.swift +++ b/Sources/OpenSwiftUI/Event/InputEvent/KeyboardShortcut/TODO/KeyboardShortcut.swift @@ -47,7 +47,7 @@ public struct KeyboardShortcut { } } -#if os(iOS) || os(tvOS) +#if os(iOS) || os(visionOS) || os(tvOS) import UIKit @available(tvOS, unavailable) diff --git a/Sources/OpenSwiftUI/Graphic/Color/KitCoreUINamedColorProvider.swift b/Sources/OpenSwiftUI/Graphic/Color/KitCoreUINamedColorProvider.swift index 873cf9b69..2adc88dad 100644 --- a/Sources/OpenSwiftUI/Graphic/Color/KitCoreUINamedColorProvider.swift +++ b/Sources/OpenSwiftUI/Graphic/Color/KitCoreUINamedColorProvider.swift @@ -8,7 +8,7 @@ import CoreUI import OpenSwiftUICore -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #elseif os(macOS) import AppKit @@ -18,7 +18,7 @@ struct KitCoreUINamedColorProvider: CoreUINamedColorProvider { static func effectiveCGColor(cuiColor: CUINamedColor, in environment: EnvironmentValues) -> CGColor? { let name = cuiColor.systemColorName let selector = Selector(name) - #if os(iOS) // 6.4.41 + #if os(iOS) || os(visionOS) // 6.4.41 guard UIColor.responds(to: selector) else { return nil } @@ -40,7 +40,7 @@ struct KitCoreUINamedColorProvider: CoreUINamedColorProvider { #endif } - #if os(iOS) + #if os(iOS) || os(visionOS) @inline(__always) static func withTraitCollection( cuiColor: CUINamedColor, diff --git a/Sources/OpenSwiftUI/Integration/Render/AppKit/NSViewPlatformViewDefinition.swift b/Sources/OpenSwiftUI/Integration/Hosting/AppKit/NSViewPlatformViewDefinition.swift similarity index 100% rename from Sources/OpenSwiftUI/Integration/Render/AppKit/NSViewPlatformViewDefinition.swift rename to Sources/OpenSwiftUI/Integration/Hosting/AppKit/NSViewPlatformViewDefinition.swift diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/Controller/UIHostingController.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/Controller/UIHostingController.swift index 842850257..21c17a568 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/Controller/UIHostingController.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/Controller/UIHostingController.swift @@ -1,4 +1,4 @@ -#if os(iOS) +#if os(iOS) || os(visionOS) public import UIKit @available(macOS, unavailable) diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/Controller/UIHostingControllerSizingOptions.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/Controller/UIHostingControllerSizingOptions.swift index 126c965a1..6501a5111 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/Controller/UIHostingControllerSizingOptions.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/Controller/UIHostingControllerSizingOptions.swift @@ -5,7 +5,7 @@ // Audited for iOS 18.0 // Status: Complete -#if os(iOS) +#if os(iOS) || os(visionOS) /// Options for how a hosting controller tracks its content’s size. @available(macOS, unavailable) diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/UIHostingViewable.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/UIHostingViewable.swift index 8f826cd7e..6141f9e7c 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/UIHostingViewable.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/UIHostingViewable.swift @@ -5,7 +5,7 @@ // Audited for iOS 18.0 // Status: Complete -#if os(iOS) +#if os(iOS) || os(visionOS) public import Foundation import UIKit diff --git a/Sources/OpenSwiftUI/Integration/Render/UIKit/UIViewPlatformViewDefinition.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/UIViewPlatformViewDefinition.swift similarity index 52% rename from Sources/OpenSwiftUI/Integration/Render/UIKit/UIViewPlatformViewDefinition.swift rename to Sources/OpenSwiftUI/Integration/Hosting/UIKit/UIViewPlatformViewDefinition.swift index 7bccfce0c..c9074847f 100644 --- a/Sources/OpenSwiftUI/Integration/Render/UIKit/UIViewPlatformViewDefinition.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/UIViewPlatformViewDefinition.swift @@ -2,17 +2,17 @@ // UIViewPlatformViewDefinition.swift // OpenSwiftUI // -// Audited for 6.0.87 +// Audited for 6.5.4 // Status: WIP // ID: A34643117F00277B93DEBAB70EC06971 (SwiftUI?) -#if os(iOS) +#if os(iOS) || os(visionOS) @_spi(DisplayList_ViewSystem) import OpenSwiftUICore import UIKit import OpenSwiftUISymbolDualTestsSupport import OpenSwiftUI_SPI -// MARK: - UIViewPlatformViewDefinition [TODO] +// MARK: - UIViewPlatformViewDefinition [TODO] [6.0.87] final class UIViewPlatformViewDefinition: PlatformViewDefinition, @unchecked Sendable { override final class var system: PlatformViewDefinition.System { .uiView } @@ -31,8 +31,18 @@ final class UIViewPlatformViewDefinition: PlatformViewDefinition, @unchecked Sen return view } + // Audited for 6.5.4 override static func makeLayerView(type: CALayer.Type, kind: PlatformViewDefinition.ViewKind) -> AnyObject { - _openSwiftUIUnimplementedFailure() + let cls: UIView.Type + if kind == .shape { + cls = _UIShapeHitTestingView.self + } else { + cls = kind.isContainer ? _UIInheritedView.self : _UIGraphicsView.self + } + let layer = type.init() + let view = _UIKitCreateCustomView(cls, layer) + initView(view, kind: kind) + return view } private static func initView(_ view: UIView, kind: PlatformViewDefinition.ViewKind) { @@ -66,4 +76,64 @@ final class UIViewPlatformViewDefinition: PlatformViewDefinition, @unchecked Sen layer.transform = .init(transform) } } + +// MARK: - _UIGraphicsView + +class _UIGraphicsView: UIView { + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + override func _shouldAnimateProperty(withKey key: String) -> Bool { + if layer.hasBeenCommitted { + super._shouldAnimateProperty(withKey: key) + } else { + false + } + } +} + +// MARK: - _UIInheritedView + +final class _UIInheritedView: _UIGraphicsView { + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + guard !UIViewIgnoresTouchEvents(self) else { + return nil + } + for subview in subviews.reversed() { + let convertedPoint = convert(point, to: subview) + let result = subview.hitTest(convertedPoint, with: event) + if let result { + return result + } + } + return nil + } +} + +// MARK: - _UIShapeHitTestingView + +private final class _UIShapeHitTestingView: _UIGraphicsView { + var path: Path = .init() + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + guard super.hitTest(point, with: event) != nil, path.contains(point, eoFill: false) else { + return nil + } + return self + } +} + #endif diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/AnyUIHostingView.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/AnyUIHostingView.swift index 81679a357..c0a2e36e9 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/AnyUIHostingView.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/AnyUIHostingView.swift @@ -5,7 +5,7 @@ // Audited for 6.5.4 // Status: Complete -#if os(iOS) +#if os(iOS) || os(visionOS) @_spi(ForOpenSwiftUIOnly) import OpenSwiftUICore diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIGraphicsView.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIGraphicsView.swift deleted file mode 100644 index 6b65dcac6..000000000 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIGraphicsView.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// UIGraphicsView.swift -// OpenSwiftUI -// -// Audited for iOS 18.0 -// Status: Complete - -#if os(iOS) -import OpenSwiftUI_SPI -import UIKit - -final class _UIGraphicsView: UIView { - override init(frame: CGRect) { - super.init(frame: frame) - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - override func _shouldAnimateProperty(withKey key: String) -> Bool { - if layer.hasBeenCommitted { - super._shouldAnimateProperty(withKey: key) - } else { - false - } - } -} -#endif diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift index d157cb3ac..96f315b6a 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift @@ -6,7 +6,7 @@ // Status: WIP // ID: FAF0B683EB49BE9BABC9009857940A1E (SwiftUI) -#if os(iOS) +#if os(iOS) || os(visionOS) @_spi(ForOpenSwiftUIOnly) @_spi(Private) public import OpenSwiftUICore @@ -381,8 +381,13 @@ extension _UIHostingView { let keyboardFrame, let window, keyboardFrame.size.isNonEmpty { + #if !os(visionOS) let convertedKeyboardFrame = convert(keyboardFrame, from: window.screen.coordinateSpace) bottomInset = convertedKeyboardFrame.minY - bounds.maxY + #else + // FIXME + bottomInset = .zero + #endif } else { bottomInset = 0.0 } @@ -647,6 +652,10 @@ extension _UIHostingView: TestHost { extension UIDevice { package var screenSize: CGSize { + #if os(visionOS) + // FIXME + return .zero + #else let screenBounds = UIScreen.main.bounds let screenWidth = screenBounds.width let screenHeight = screenBounds.height @@ -668,6 +677,7 @@ extension UIDevice { finalHeight = screenHeight } return CGSize(width: finalWidth, height: finalHeight) + #endif } } diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift index a209ba5dd..131bcc15c 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift @@ -6,7 +6,7 @@ // Status: WIP // ID: 529B7E967685565FD5A0228999A3F1FE (SwiftUI) -#if os(iOS) +#if os(iOS) || os(visionOS) package import QuartzCore package import UIKit @@ -557,9 +557,11 @@ package class UIHostingViewBase { NSLocale.currentLocaleDidChangeNotification, .NSSystemTimeZoneDidChange, ] + #if !os(visionOS) names.append( UIScene.systemProtectionDidChangeNotification ) + #endif for name in names { center.addObserver( self, @@ -702,7 +704,12 @@ extension UIHostingViewBase: ViewGraphRenderDelegate { guard let uiView else { return } + #if os(visionOS) + // FIXME + context.contentsScale = 3.0 + #else context.contentsScale = uiView.window?.screen.scale ?? 1.0 + #endif } package func withMainThreadRender(wasAsync: Bool, _ body: () -> Time) -> Time { @@ -804,10 +811,14 @@ final package class DisplayLink: NSObject { package init(host: UIHostingViewBase, window: UIWindow) { super.init() self.host = host + #if os(visionOS) + // FIXME + #else link = window.screen.displayLink( withTarget: self, selector: #selector(displayLinkTimer(_:)) ) + #endif link?.add(to: .main, forMode: .common) } diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewDebugLayer.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewDebugLayer.swift index a81704739..739bbfdd7 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewDebugLayer.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewDebugLayer.swift @@ -5,7 +5,7 @@ // Audited for 6.5.4 // Status: Complete -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit final class UIHostingViewDebugLayer: CALayer { diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIInheritedView.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIInheritedView.swift deleted file mode 100644 index 4ce35aef6..000000000 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIInheritedView.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// UIInheritedView.swift -// OpenSwiftUI -// -// Audited for iOS 18.0 -// Status: Complete - -#if os(iOS) -import OpenSwiftUI_SPI -import UIKit - -final class _UIInheritedView: UIView { - override init(frame: CGRect) { - super.init(frame: frame) - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { - guard !UIViewIgnoresTouchEvents(self) else { - return nil - } - for subview in subviews.reversed() { - let convertedPoint = convert(point, to: subview) - let result = subview.hitTest(convertedPoint, with: event) - if let result { - return result - } - } - return nil - } -} -#endif diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIViewControllerProvider.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIViewControllerProvider.swift index a1ecaf8da..c1894bcda 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIViewControllerProvider.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIViewControllerProvider.swift @@ -5,7 +5,7 @@ // Audited for 6.5.4 // Status: Complete -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit diff --git a/Sources/OpenSwiftUI/Integration/Representable/Platform/PlatformViewHost.swift b/Sources/OpenSwiftUI/Integration/Representable/Platform/PlatformViewHost.swift index 7da1c859c..dc3fbda3f 100644 --- a/Sources/OpenSwiftUI/Integration/Representable/Platform/PlatformViewHost.swift +++ b/Sources/OpenSwiftUI/Integration/Representable/Platform/PlatformViewHost.swift @@ -11,7 +11,7 @@ import OpenSwiftUICore import Foundation import OpenSwiftUI_SPI -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias PlatformConstraintBasedLayoutHostingView = _UIConstraintBasedLayoutHostingView #elseif os(macOS) @@ -49,7 +49,7 @@ where Content: PlatformViewRepresentable { let safeAreaHelper: PlatformView.SafeAreaHelper = .init() - #if os(iOS) + #if os(iOS) || os(visionOS) var _safeAreaInsets: PlatformEdgeInsets = .init( top: .greatestFiniteMagnitude, left: .greatestFiniteMagnitude, @@ -92,7 +92,7 @@ where Content: PlatformViewRepresentable { if Content.isViewController { viewHierarchyMode = isLinkedOnOrAfter(.v6) ? .willMoveToSuperview : .didMoveToWindow } - #if os(iOS) + #if os(iOS) || os(visionOS) if isLinkedOnOrAfter(.v6) { layer.allowsGroupOpacity = false layer.allowsGroupBlending = false @@ -109,7 +109,7 @@ where Content: PlatformViewRepresentable { } private func intrinsicLayoutTraits() -> _LayoutTraits { - #if os(iOS) + #if os(iOS) || os(visionOS) func dimension(value: CGFloat, axis: NSLayoutConstraint.Axis) -> _LayoutTraits.Dimension { if value == PlatformView.noIntrinsicMetric { return .init(min: .zero, ideal: .zero, max: .infinity) @@ -154,7 +154,7 @@ where Content: PlatformViewRepresentable { set { super.hostedView = newValue } } - #if os(iOS) + #if os(iOS) || os(visionOS) override func didAddSubview(_ subview: PlatformView) { super.didAddSubview(subview) guard let viewController = representedViewProvider as? PlatformViewController else { @@ -229,7 +229,7 @@ where Content: PlatformViewRepresentable { } #endif - #if os(iOS) + #if os(iOS) || os(visionOS) private func layoutHostedView() { let enableUnifiedLayout = enableUnifiedLayout() guard let hostedView else { @@ -260,7 +260,7 @@ where Content: PlatformViewRepresentable { } #endif - #if os(iOS) + #if os(iOS) || os(visionOS) override func contentCompressionResistancePriority(for axis: NSLayoutConstraint.Axis) -> UILayoutPriority { if Content.isViewController { return super.contentCompressionResistancePriority(for: axis) @@ -320,7 +320,7 @@ extension PlatformViewHost: SafeAreaHelperDelegate { #endif var defaultSafeAreaInsets: PlatformEdgeInsets { - #if os(iOS) + #if os(iOS) || os(visionOS) super.safeAreaInsets #elseif os(macOS) super.computedSafeAreaInsets diff --git a/Sources/OpenSwiftUI/Integration/Representable/Platform/PlatformViewRepresentable.swift b/Sources/OpenSwiftUI/Integration/Representable/Platform/PlatformViewRepresentable.swift index 878ec9adf..3fca4bdae 100644 --- a/Sources/OpenSwiftUI/Integration/Representable/Platform/PlatformViewRepresentable.swift +++ b/Sources/OpenSwiftUI/Integration/Representable/Platform/PlatformViewRepresentable.swift @@ -6,7 +6,7 @@ // Status: WIP // ID: A513612C07DFA438E70B9FA90719B40D (SwiftUI) -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias PlatformView = UIView typealias PlatformViewController = UIViewController diff --git a/Sources/OpenSwiftUI/Integration/Representable/Platform/SafeAreaHelper.swift b/Sources/OpenSwiftUI/Integration/Representable/Platform/SafeAreaHelper.swift index e1c09ade7..f63a01dcb 100644 --- a/Sources/OpenSwiftUI/Integration/Representable/Platform/SafeAreaHelper.swift +++ b/Sources/OpenSwiftUI/Integration/Representable/Platform/SafeAreaHelper.swift @@ -15,7 +15,7 @@ protocol SafeAreaHelperDelegate: AnyObject { var shouldEagerlyUpdatesSafeArea: Bool { get } } -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit typealias PlatformEdgeInsets = UIEdgeInsets #elseif os(macOS) diff --git a/Sources/OpenSwiftUI/Integration/Representable/UIKit/UIViewControllerRepresentable.swift b/Sources/OpenSwiftUI/Integration/Representable/UIKit/UIViewControllerRepresentable.swift index a9998fa42..91466cf81 100644 --- a/Sources/OpenSwiftUI/Integration/Representable/UIKit/UIViewControllerRepresentable.swift +++ b/Sources/OpenSwiftUI/Integration/Representable/UIKit/UIViewControllerRepresentable.swift @@ -6,7 +6,7 @@ // Status: Blocked by makePreferenceWriter & UIKitAnimationBridge // ID: F0196C17270D74A1F1A35F1926215FB3 (SwiftUI) -#if os(iOS) +#if os(iOS) || os(visionOS) public import UIKit public import OpenSwiftUICore diff --git a/Sources/OpenSwiftUI/Integration/Representable/UIKit/UIViewRepresentable.swift b/Sources/OpenSwiftUI/Integration/Representable/UIKit/UIViewRepresentable.swift index 2f13719fb..51d56c584 100644 --- a/Sources/OpenSwiftUI/Integration/Representable/UIKit/UIViewRepresentable.swift +++ b/Sources/OpenSwiftUI/Integration/Representable/UIKit/UIViewRepresentable.swift @@ -6,7 +6,7 @@ // Status: WIP // ID: 19642D833A8FE469B137699ED1426762 (SwiftUI) -#if os(iOS) +#if os(iOS) || os(visionOS) public import UIKit public import OpenSwiftUICore diff --git a/Sources/OpenSwiftUI/Test/PerformanceTest.swift b/Sources/OpenSwiftUI/Test/PerformanceTest.swift index cc7cbb13f..912211ba4 100644 --- a/Sources/OpenSwiftUI/Test/PerformanceTest.swift +++ b/Sources/OpenSwiftUI/Test/PerformanceTest.swift @@ -4,7 +4,7 @@ // // Status: Complete -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #elseif os(macOS) import AppKit @@ -29,7 +29,7 @@ extension __App { @available(OpenSwiftUI_v1_0, *) extension _BenchmarkHost { public func _started(test: _PerformanceTest) { - #if os(iOS) + #if os(iOS) || os(visionOS) UIApplication.shared.startedTest(test.name) #elseif os(macOS) NSApplication.shared.startedTest(test.name) @@ -38,7 +38,7 @@ extension _BenchmarkHost { } public func _finished(test: _PerformanceTest) { - #if os(iOS) + #if os(iOS) || os(visionOS) UIApplication.shared.finishedTest(test.name) #elseif os(macOS) NSApplication.shared.finishedTest(test.name) @@ -47,7 +47,7 @@ extension _BenchmarkHost { } public func _failed(test: _PerformanceTest) { - #if os(iOS) + #if os(iOS) || os(visionOS) UIApplication.shared.failedTest(test.name, withFailure: nil) #elseif os(macOS) NSApplication.shared.failedTest(test.name, withFailure: nil) diff --git a/Sources/OpenSwiftUI/Test/TestingAppDelegate.swift b/Sources/OpenSwiftUI/Test/TestingAppDelegate.swift index 46b7dcf02..ecce636c7 100644 --- a/Sources/OpenSwiftUI/Test/TestingAppDelegate.swift +++ b/Sources/OpenSwiftUI/Test/TestingAppDelegate.swift @@ -4,7 +4,7 @@ // // Status: Complete for iOS -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #elseif os(macOS) import AppKit @@ -21,7 +21,7 @@ class TestingAppDelegate: DelegateBaseClass, PlatformApplicationDelegate { static var application: PlatformApplication? - #if os(iOS) + #if os(iOS) || os(visionOS) func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { true } diff --git a/Sources/OpenSwiftUI/Test/TestingSceneDelegate.swift b/Sources/OpenSwiftUI/Test/TestingSceneDelegate.swift index a0d9898f9..1b27f6646 100644 --- a/Sources/OpenSwiftUI/Test/TestingSceneDelegate.swift +++ b/Sources/OpenSwiftUI/Test/TestingSceneDelegate.swift @@ -4,7 +4,7 @@ // // Status: Complete for iOS -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit // MARK: - TestingSceneDelegate [6.4.41] [iOS] diff --git a/Sources/OpenSwiftUI/Test/ViewTest.swift b/Sources/OpenSwiftUI/Test/ViewTest.swift index 8a75d855f..60616c82a 100644 --- a/Sources/OpenSwiftUI/Test/ViewTest.swift +++ b/Sources/OpenSwiftUI/Test/ViewTest.swift @@ -8,7 +8,7 @@ public import Foundation @_spi(ForOpenSwiftUIOnly) import OpenSwiftUICore -#if os(iOS) +#if os(iOS) || os(visionOS) public import UIKit #endif @@ -27,7 +27,7 @@ public protocol _ViewTest: _Test { func setTestView(_ view: V) where V: View } -#if os(iOS) +#if os(iOS) || os(visionOS) private enum Error: Swift.Error { case failedToReenableAnimations(String) case failedToDismissPresentation(String) @@ -49,7 +49,7 @@ extension _ViewTest { public func tearDownTest() { resetEvents() setRootTestView(EmptyView()) - #if os(iOS) + #if os(iOS) || os(visionOS) func performRender() { withRenderOptions(.simple) { render() @@ -63,7 +63,7 @@ extension _ViewTest { @available(OpenSwiftUI_v4_4, *) public func tearDownTestWithError() throws { - #if os(iOS) + #if os(iOS) || os(visionOS) guard !UIView.areAnimationsEnabled else { return } @@ -202,7 +202,7 @@ extension _ViewTest { _TestApp.setTestEnvironment(environment) } - #if os(iOS) + #if os(iOS) || os(visionOS) public var systemColorScheme: UIUserInterfaceStyle? { let view = _TestApp.host! as! UIView guard let window = view.window, diff --git a/Sources/OpenSwiftUI/Util/OpenSwiftUIGlue.swift b/Sources/OpenSwiftUI/Util/OpenSwiftUIGlue.swift index 8e8cb83ae..3e944c817 100644 --- a/Sources/OpenSwiftUI/Util/OpenSwiftUIGlue.swift +++ b/Sources/OpenSwiftUI/Util/OpenSwiftUIGlue.swift @@ -85,14 +85,14 @@ public func OpenSwiftUIGlue2Class() -> CoreGlue2.Type { @objc(OpenSwiftUIGlue2) #endif final public class OpenSwiftUIGlue2: CoreGlue2 { - #if os(iOS) + #if os(iOS) || os(visionOS) override public final func initializeTestApp() { _PerformTestingSwizzles() } #endif override public final func isStatusBarHidden() -> Bool? { - #if os(iOS) + #if os(iOS) || os(visionOS) guard let scene = UIApplication.shared.connectedScenes.first, let windowScene = scene as? UIWindowScene else { @@ -109,7 +109,7 @@ final public class OpenSwiftUIGlue2: CoreGlue2 { } override public final func configureDefaultEnvironment(_: inout EnvironmentValues) { - #if os(iOS) + #if os(iOS) || os(visionOS) #else // TODO #endif @@ -120,7 +120,7 @@ final public class OpenSwiftUIGlue2: CoreGlue2 { } override public final var systemDefaultDynamicTypeSize: DynamicTypeSize { - #if os(iOS) + #if os(iOS) || os(visionOS) let size = _UIApplicationDefaultContentSizeCategory() let dynamicSize = DynamicTypeSize(size) return dynamicSize ?? .large diff --git a/Sources/OpenSwiftUI/View/Control/Link/OpenURLActionKey.swift b/Sources/OpenSwiftUI/View/Control/Link/OpenURLActionKey.swift index 698c6ba3a..3b785be88 100644 --- a/Sources/OpenSwiftUI/View/Control/Link/OpenURLActionKey.swift +++ b/Sources/OpenSwiftUI/View/Control/Link/OpenURLActionKey.swift @@ -6,7 +6,7 @@ // Status: Complete #if canImport(Darwin) -#if os(iOS) || os(tvOS) +#if os(iOS) || os(visionOS) || os(tvOS) import UIKit #if os(iOS) && !targetEnvironment(macCatalyst) import OpenSwiftUI_SPI @@ -19,7 +19,7 @@ import AppKit struct OpenURLActionKey: EnvironmentKey { static let defaultValue = OpenURLAction( handler: .system { url, completion in - #if os(iOS) || os(tvOS) + #if os(iOS) || os(visionOS) || os(tvOS) UIApplication.shared.open(url, options: [:], completionHandler: completion) #elseif os(macOS) NSWorkspace.shared.open(url, configuration: .init()) { _, error in diff --git a/Sources/OpenSwiftUI/View/Toggle/Switch.swift b/Sources/OpenSwiftUI/View/Toggle/Switch.swift index f723d2309..8477e928b 100644 --- a/Sources/OpenSwiftUI/View/Toggle/Switch.swift +++ b/Sources/OpenSwiftUI/View/Toggle/Switch.swift @@ -6,7 +6,7 @@ // Status: Blocked by Color // ID: 1246D37251EA3A918B392E2B95F8B7EF -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit private struct Switch: UIViewRepresentable { diff --git a/Sources/OpenSwiftUICore/Render/CoreAnimation/CAFrameRateRangeUtil.swift b/Sources/OpenSwiftUICore/Render/CoreAnimation/CAFrameRateRangeUtil.swift index d191e4911..f6bfe00cd 100644 --- a/Sources/OpenSwiftUICore/Render/CoreAnimation/CAFrameRateRangeUtil.swift +++ b/Sources/OpenSwiftUICore/Render/CoreAnimation/CAFrameRateRangeUtil.swift @@ -5,7 +5,7 @@ // Audited for 6.5.4 // Status: Complete -#if os(iOS) && canImport(QuartzCore) +#if (os(iOS) || os(visionOS)) && canImport(QuartzCore) import QuartzCore extension CAFrameRateRange { diff --git a/Sources/OpenSwiftUICore/Render/PlatformViewDefinition.swift b/Sources/OpenSwiftUICore/Render/DisplayList/DisplayListViewPlatform.swift similarity index 93% rename from Sources/OpenSwiftUICore/Render/PlatformViewDefinition.swift rename to Sources/OpenSwiftUICore/Render/DisplayList/DisplayListViewPlatform.swift index c0775b9a6..bb4a93dfd 100644 --- a/Sources/OpenSwiftUICore/Render/PlatformViewDefinition.swift +++ b/Sources/OpenSwiftUICore/Render/DisplayList/DisplayListViewPlatform.swift @@ -4,6 +4,7 @@ // // Audited for iOS 18.0 // Status: Blocked by PlatformDrawable and GraphicsContext +// ID: 8BBC66CBE42B8A65F8A2F3799C81A349 (SwiftUICore) import OpenSwiftUI_SPI #if canImport(QuartzCore) @@ -50,6 +51,9 @@ open class PlatformViewDefinition: @unchecked Sendable { } open class var system: PlatformViewDefinition.System { .init(base: .caLayer) } + #if os(visionOS) // TODO: VWT alignment issue when running for Designed for iPad + open class func makeView(kind: PlatformViewDefinition.ViewKind, item: Any) -> AnyObject { _openSwiftUIBaseClassAbstractMethod() } + #endif open class func makeView(kind: PlatformViewDefinition.ViewKind) -> AnyObject { _openSwiftUIBaseClassAbstractMethod() } #if canImport(Darwin) open class func makeLayerView(type: CALayer.Type, kind: PlatformViewDefinition.ViewKind) -> AnyObject { _openSwiftUIBaseClassAbstractMethod() } diff --git a/Sources/OpenSwiftUICore/View/Extension/View_Opacity.swift b/Sources/OpenSwiftUICore/View/Extension/View_Opacity.swift deleted file mode 100644 index cc862efb9..000000000 --- a/Sources/OpenSwiftUICore/View/Extension/View_Opacity.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// View_Opacity.swift -// OpenSwiftUI -// -// Audited for iOS 15.5 -// Status: WIP - -extension View { - @inlinable - public func opacity(_ opacity: Double) -> some View { - modifier(_OpacityEffect(opacity: opacity)) - } -} - -@frozen -public struct _OpacityEffect: Equatable { - public var opacity: Double - @inlinable public init(opacity: Double) { - self.opacity = opacity - } -} - -extension _OpacityEffect: Animatable { - public var animatableData: Double { - get { opacity } - set { opacity = newValue } - } -} - -extension _OpacityEffect: PrimitiveViewModifier, ViewModifier /* , MultiViewModifier */ { - // public static func _makeView(modifier: _GraphValue<_OpacityEffect>, inputs: _ViewInputs, body: @escaping (_Graph, _ViewInputs) -> _ViewOutputs) -> _ViewOutputs -} - -// TODO: RendererEffect _RendererEffect - -// TODO: CodableByProxy - -extension _OpacityEffect: Sendable {} - -// extension AnyTransition { -// public static let opacity: AnyTransition -// } diff --git a/Sources/OpenSwiftUISymbolDualTestsSupport/Render/CoreAnimation/CAFrameRateRangeUtil+TestSub.c b/Sources/OpenSwiftUISymbolDualTestsSupport/Render/CoreAnimation/CAFrameRateRangeUtil+TestSub.c index f7b78a68d..430f34ab3 100644 --- a/Sources/OpenSwiftUISymbolDualTestsSupport/Render/CoreAnimation/CAFrameRateRangeUtil+TestSub.c +++ b/Sources/OpenSwiftUISymbolDualTestsSupport/Render/CoreAnimation/CAFrameRateRangeUtil+TestSub.c @@ -4,7 +4,7 @@ #include "OpenSwiftUIBase.h" -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION #import diff --git a/Sources/OpenSwiftUITestsSupport/Integration/PlatformAlias.swift b/Sources/OpenSwiftUITestsSupport/Integration/PlatformAlias.swift index 3bc154e77..0637f1c81 100644 --- a/Sources/OpenSwiftUITestsSupport/Integration/PlatformAlias.swift +++ b/Sources/OpenSwiftUITestsSupport/Integration/PlatformAlias.swift @@ -8,7 +8,7 @@ package import OpenSwiftUI package import SwiftUI #endif -#if os(iOS) +#if os(iOS) || os(visionOS) package import UIKit package typealias PlatformWindow = UIWindow package typealias PlatformViewController = UIViewController diff --git a/Sources/OpenSwiftUITestsSupport/Integration/PlatformHostingControllerHelper.swift b/Sources/OpenSwiftUITestsSupport/Integration/PlatformHostingControllerHelper.swift index 0a8b2df55..8c700d7f2 100644 --- a/Sources/OpenSwiftUITestsSupport/Integration/PlatformHostingControllerHelper.swift +++ b/Sources/OpenSwiftUITestsSupport/Integration/PlatformHostingControllerHelper.swift @@ -3,7 +3,7 @@ // OpenSwiftUITestsSupport #if canImport(Darwin) -#if os(iOS) +#if os(iOS) || os(visionOS) package import UIKit #elseif os(macOS) package import AppKit @@ -14,7 +14,7 @@ package import Testing extension PlatformViewController { // NOTE: Remember to withExtendedLifetime for window to ensure it is not deallocated duration animation or update. package func triggerLayout() { - #if os(iOS) + #if os(iOS) || os(visionOS) let window = UIWindow(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) window.rootViewController = self window.makeKeyAndVisible() diff --git a/Sources/OpenSwiftUI_SPI/OpenSwiftUITargetConditionals.h b/Sources/OpenSwiftUI_SPI/OpenSwiftUITargetConditionals.h index efba3b268..d20e525f8 100644 --- a/Sources/OpenSwiftUI_SPI/OpenSwiftUITargetConditionals.h +++ b/Sources/OpenSwiftUI_SPI/OpenSwiftUITargetConditionals.h @@ -143,6 +143,7 @@ #define OPENSWIFTUI_TARGET_OS_OSX TARGET_OS_OSX #define OPENSWIFTUI_TARGET_OS_IPHONE TARGET_OS_IPHONE #define OPENSWIFTUI_TARGET_OS_IOS TARGET_OS_IOS +#define OPENSWIFTUI_TARGET_OS_VISION TARGET_OS_VISION #define OPENSWIFTUI_TARGET_OS_WATCH TARGET_OS_WATCH #define OPENSWIFTUI_TARGET_OS_TV TARGET_OS_TV #define OPENSWIFTUI_TARGET_OS_MACCATALYST TARGET_OS_MACCATALYST @@ -151,6 +152,7 @@ // iOS, watchOS, and tvOS are not supported #define OPENSWIFTUI_TARGET_OS_IPHONE 0 #define OPENSWIFTUI_TARGET_OS_IOS 0 +#define OPENSWIFTUI_TARGET_OS_VISION 0 #define OPENSWIFTUI_TARGET_OS_WATCH 0 #define OPENSWIFTUI_TARGET_OS_TV 0 #define OPENSWIFTUI_TARGET_OS_MACCATALYST 0 diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreColor.h b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreColor.h index 441875bef..8119703c1 100644 --- a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreColor.h +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreColor.h @@ -12,7 +12,7 @@ #if OPENSWIFTUI_TARGET_OS_DARWIN -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION #include #else #include diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICorePlatformImage.m b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICorePlatformImage.m index b0d5db159..92f7bca46 100644 --- a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICorePlatformImage.m +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICorePlatformImage.m @@ -10,7 +10,7 @@ #if OPENSWIFTUI_TARGET_OS_DARWIN #include -#if OPENSWIFTUI_TARGET_OS_IOS +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION #include #else #include diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.h b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.h index 0eedff12b..2dc08bca5 100644 --- a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.h +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.h @@ -15,10 +15,20 @@ #include "OpenSwiftUIViewSystem.h" #include +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION +#include +#else +#include +#endif + NS_ASSUME_NONNULL_BEGIN CALayer * OpenSwiftUICoreViewLayer(OpenSwiftUIViewSystem system, id view) OPENSWIFTUI_SWIFT_NAME(CoreViewLayer(system:view:)); +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION +UIView * _UIKitCreateCustomView(Class class, CALayer *layer); +#endif + NS_ASSUME_NONNULL_END #endif /* OPENSWIFTUI_TARGET_OS_DARWIN */ diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.m b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.m index 824cdb17e..f6f04e586 100644 --- a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.m +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.m @@ -5,10 +5,17 @@ // Status: WIP // Audited for 6.5.4 -#import "OpenSwiftUICoreView.h" +#include "OpenSwiftUICoreView.h" #if OPENSWIFTUI_TARGET_OS_DARWIN +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION +#include +#include "Shims/UIKit/UIKit_Private.h" +#else +#include +#endif + CALayer * OpenSwiftUICoreViewLayer(OpenSwiftUIViewSystem system, id view) { if (system == OpenSwiftUIViewSystemCALayer) { return view; @@ -17,4 +24,10 @@ } } +#if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION +UIView * _UIKitCreateCustomView(Class class, CALayer *layer) { + return [[class alloc] _initWithLayer:layer]; +} +#endif + #endif /* OPENSWIFTUI_TARGET_OS_DARWIN */ diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.h b/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.h index 2f37db8a2..2c599112c 100644 --- a/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.h +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.h @@ -10,7 +10,7 @@ #include "OpenSwiftUIBase.h" -#if OPENSWIFTUI_TARGET_OS_IOS && OPENSWIFTUI_LINK_COREUI +#if (OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION) && OPENSWIFTUI_LINK_COREUI #import #import @@ -21,6 +21,6 @@ CUIDeviceIdiom _CUIIdiomForIdiom(UIUserInterfaceIdiom idiom); OPENSWIFTUI_EXPORT CUISubtype _CUISubtypeForIdiom(UIUserInterfaceIdiom idiom); -#endif /* OPENSWIFTUI_TARGET_OS_IOS && OPENSWIFTUI_LINK_COREUI */ +#endif /* (OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION) && OPENSWIFTUI_LINK_COREUI */ #endif /* CoreUI_UIUserInterfaceIdiom_h */ diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.m b/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.m index 0ed11ea05..b9277d6e2 100644 --- a/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.m +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.m @@ -7,7 +7,7 @@ #include "CoreUI+UIUserInterfaceIdiom.h" -#if OPENSWIFTUI_TARGET_OS_IOS && OPENSWIFTUI_LINK_COREUI +#if (OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION) && OPENSWIFTUI_LINK_COREUI #include "../../Shims/UIKit/UIKit_Private.h" CUIDeviceIdiom _CUIIdiomForIdiom(UIUserInterfaceIdiom idiom) { @@ -24,33 +24,35 @@ CUIDeviceIdiom _CUIIdiomForIdiom(UIUserInterfaceIdiom idiom) { } CUISubtype _CUISubtypeForIdiom(UIUserInterfaceIdiom idiom) { - switch (idiom) { - case UIUserInterfaceIdiomPhone: { - CGRect bounds = UIScreen.mainScreen._referenceBounds_openswiftui_safe_wrapper; - double height = CGRectGetHeight(bounds); - if (height > 667.0) { - return CUISubtypeIPhonePlus; - } else if (height > 568.0) { - return CUISubtypeIPhone47Inch; - } else if (height > 480.0) { - return CUISubtypeIPhone4Inch; - } else { - return CUISubtypeNormal; - } - } - case UIUserInterfaceIdiomPad: { - CGFloat pointsPerInch = UIScreen.mainScreen._pointsPerInch_openswiftui_safe_wrapper; - return pointsPerInch == 163.0 ? CUISubtypeIPadMini : CUISubtypeNormal; - } - case UIUserInterfaceIdiomTV: { - CGRect bounds = UIScreen.mainScreen._referenceBounds_openswiftui_safe_wrapper; - double height = CGRectGetHeight(bounds) * UIScreen.mainScreen.scale; - return height < 1080.0 ? CUISubtypeAppleTVHD : CUISubtypeNormal; - } - case /* UIUserInterfaceIdiomWatch */ 4: return CUISubtypeAppleWatch38; - case UIUserInterfaceIdiomVision: return CUISubtypeAppleVision; - default: return CUISubtypeNormal; - } +// switch (idiom) { +// case UIUserInterfaceIdiomPhone: { +// CGRect bounds = UIScreen.mainScreen._referenceBounds_openswiftui_safe_wrapper; +// double height = CGRectGetHeight(bounds); +// if (height > 667.0) { +// return CUISubtypeIPhonePlus; +// } else if (height > 568.0) { +// return CUISubtypeIPhone47Inch; +// } else if (height > 480.0) { +// return CUISubtypeIPhone4Inch; +// } else { +// return CUISubtypeNormal; +// } +// } +// case UIUserInterfaceIdiomPad: { +// CGFloat pointsPerInch = UIScreen.mainScreen._pointsPerInch_openswiftui_safe_wrapper; +// return pointsPerInch == 163.0 ? CUISubtypeIPadMini : CUISubtypeNormal; +// } +// case UIUserInterfaceIdiomTV: { +// CGRect bounds = UIScreen.mainScreen._referenceBounds_openswiftui_safe_wrapper; +// double height = CGRectGetHeight(bounds) * UIScreen.mainScreen.scale; +// return height < 1080.0 ? CUISubtypeAppleTVHD : CUISubtypeNormal; +// } +// case /* UIUserInterfaceIdiomWatch */ 4: return CUISubtypeAppleWatch38; +// case UIUserInterfaceIdiomVision: return CUISubtypeAppleVision; +// default: return CUISubtypeNormal; +// } + // FIXME: UIScreen + return CUISubtypeNormal; } -#endif /* OPENSWIFTUI_TARGET_OS_IOS && OPENSWIFTUI_LINK_COREUI */ +#endif /* (OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION) && OPENSWIFTUI_LINK_COREUI */ diff --git a/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.h b/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.h index 16ed78a02..62d33a2e8 100644 --- a/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.h +++ b/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.h @@ -26,6 +26,7 @@ OPENSWIFTUI_ASSUME_NONNULL_BEGIN @end @interface UIView (OpenSwiftUI_SPI) +- (instancetype)_initWithLayer:(CALayer *)layer; - (BOOL)_shouldAnimatePropertyWithKey_openswiftui_safe_wrapper:(NSString *)key OPENSWIFTUI_SWIFT_NAME(_shouldAnimateProperty(withKey:)); - (void)_setFocusInteractionEnabled_openswiftui_safe_wrapper:(BOOL)enabled OPENSWIFTUI_SWIFT_NAME(_setFocusInteractionEnabled(_:)); @property(nonatomic, readonly, nullable) UIViewController *_viewControllerForAncestor_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_viewControllerForAncestor); diff --git a/Tests/OpenSwiftUICompatibilityTests/View/IdentifiedView/IdentifiedViewProxyCompatibilityTests.swift b/Tests/OpenSwiftUICompatibilityTests/View/IdentifiedView/IdentifiedViewProxyCompatibilityTests.swift index c27f34b3d..4dfc767e4 100644 --- a/Tests/OpenSwiftUICompatibilityTests/View/IdentifiedView/IdentifiedViewProxyCompatibilityTests.swift +++ b/Tests/OpenSwiftUICompatibilityTests/View/IdentifiedView/IdentifiedViewProxyCompatibilityTests.swift @@ -3,7 +3,7 @@ // OpenSwiftUICompatibilityTests import Testing -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #endif @@ -11,7 +11,7 @@ import UIKit struct IdentifiedViewProxyCompatibilityTests { @Test func boundingRect() async { - #if os(iOS) && OPENSWIFTUI_COMPATIBILITY_TEST // FIXME: add _identified modifier + #if (os(iOS) || os(visionOS)) && OPENSWIFTUI_COMPATIBILITY_TEST // FIXME: add _identified modifier let identifier = "Test" let hosting = UIHostingController(rootView: AnyView(EmptyView())._identified(by: identifier)) await confirmation { @MainActor confirmation in diff --git a/Tests/OpenSwiftUICoreTests/Render/CoreAnimation/CAFrameRateRangeUtilTests.swift b/Tests/OpenSwiftUICoreTests/Render/CoreAnimation/CAFrameRateRangeUtilTests.swift index 00321c53a..5eca53a70 100644 --- a/Tests/OpenSwiftUICoreTests/Render/CoreAnimation/CAFrameRateRangeUtilTests.swift +++ b/Tests/OpenSwiftUICoreTests/Render/CoreAnimation/CAFrameRateRangeUtilTests.swift @@ -2,7 +2,7 @@ // CAFrameRateRangeUtilTests.swift // OpenSwiftUICoreTests -#if os(iOS) && canImport(QuartzCore) +#if (os(iOS) || os(visionOS)) && canImport(QuartzCore) import Testing @_spi(ForOpenSwiftUIOnly) import OpenSwiftUICore diff --git a/Tests/OpenSwiftUICoreTests/Semantic/SemanticsTests.swift b/Tests/OpenSwiftUICoreTests/Semantic/SemanticsTests.swift index 218fec6ce..0e5b3ada1 100644 --- a/Tests/OpenSwiftUICoreTests/Semantic/SemanticsTests.swift +++ b/Tests/OpenSwiftUICoreTests/Semantic/SemanticsTests.swift @@ -42,7 +42,7 @@ struct SemanticsTests { @Test func semanticsIsLinkedOnOrAfterAndIsDeployedOnOrAfter() { // This is currently tied with the toolchain's xctest binary - #if os(iOS) + #if os(iOS) || os(visionOS) #if compiler(<6.2) && compiler(>=6.1) // Path: /Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Agents/xctest // SDK version: 18.4 diff --git a/Tests/OpenSwiftUISymbolDualTests/Render/CoreAnimation/CAFrameRateRangeUtilDualTests.swift b/Tests/OpenSwiftUISymbolDualTests/Render/CoreAnimation/CAFrameRateRangeUtilDualTests.swift index 290ee1157..a478eb7c1 100644 --- a/Tests/OpenSwiftUISymbolDualTests/Render/CoreAnimation/CAFrameRateRangeUtilDualTests.swift +++ b/Tests/OpenSwiftUISymbolDualTests/Render/CoreAnimation/CAFrameRateRangeUtilDualTests.swift @@ -2,7 +2,7 @@ // CAFrameRateRangeUtilDualTests.swift // OpenSwiftUISymbolDualTests -#if os(iOS) && canImport(SwiftUI, _underlyingVersion: 6.5.4) +#if (os(iOS) || os(visionOS)) && canImport(SwiftUI, _underlyingVersion: 6.5.4) import QuartzCore import Testing diff --git a/Tests/OpenSwiftUITests/Data/Environment/EnvironmentValuesOpenURLTests.swift b/Tests/OpenSwiftUITests/Data/Environment/EnvironmentValuesOpenURLTests.swift index a64f0e0d9..fbe0d9c13 100644 --- a/Tests/OpenSwiftUITests/Data/Environment/EnvironmentValuesOpenURLTests.swift +++ b/Tests/OpenSwiftUITests/Data/Environment/EnvironmentValuesOpenURLTests.swift @@ -7,7 +7,7 @@ import Foundation import Testing struct EnvironmentValuesOpenURLTests { - #if os(iOS) || os(macOS) || os(tvOS) + #if os(iOS) || os(visionOS) || os(macOS) || os(tvOS) @Test func testOpenURLActionKey() { let value = OpenURLActionKey.defaultValue diff --git a/Tests/OpenSwiftUITests/Data/Environment/UIKitEnvironmentTests.swift b/Tests/OpenSwiftUITests/Data/Environment/UIKitEnvironmentTests.swift index a672dd57e..25a0d2c40 100644 --- a/Tests/OpenSwiftUITests/Data/Environment/UIKitEnvironmentTests.swift +++ b/Tests/OpenSwiftUITests/Data/Environment/UIKitEnvironmentTests.swift @@ -2,7 +2,7 @@ // UIKitEnvironmentTests.swift // OpenSwiftUITests -#if os(iOS) +#if os(iOS) || os(visionOS) @testable import OpenSwiftUI import Testing import UIKit diff --git a/Tests/OpenSwiftUITests/Integration/Hosting/UIKit/View/UIHostingViewBaseTests.swift b/Tests/OpenSwiftUITests/Integration/Hosting/UIKit/View/UIHostingViewBaseTests.swift index 54b83f4ce..3fc1a3973 100644 --- a/Tests/OpenSwiftUITests/Integration/Hosting/UIKit/View/UIHostingViewBaseTests.swift +++ b/Tests/OpenSwiftUITests/Integration/Hosting/UIKit/View/UIHostingViewBaseTests.swift @@ -2,7 +2,7 @@ // UIHostingViewBaseTests.swift // OpenSwiftUICoreTests -#if os(iOS) +#if os(iOS) || os(visionOS) import Foundation import Testing @testable import OpenSwiftUI diff --git a/Tests/OpenSwiftUITests/View/IdentifiedView/IdentifiedViewTreeTests.swift b/Tests/OpenSwiftUITests/View/IdentifiedView/IdentifiedViewTreeTests.swift index fa0e53b99..5b3a1ae0b 100644 --- a/Tests/OpenSwiftUITests/View/IdentifiedView/IdentifiedViewTreeTests.swift +++ b/Tests/OpenSwiftUITests/View/IdentifiedView/IdentifiedViewTreeTests.swift @@ -6,7 +6,7 @@ import Testing import OpenSwiftUI @_spi(ForOpenSwiftUIOnly) import OpenSwiftUICore -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #endif diff --git a/Tests/OpenSwiftUITests/View/ViewAliasTests.swift b/Tests/OpenSwiftUITests/View/ViewAliasTests.swift index 449a3d459..cf9b7058f 100644 --- a/Tests/OpenSwiftUITests/View/ViewAliasTests.swift +++ b/Tests/OpenSwiftUITests/View/ViewAliasTests.swift @@ -6,7 +6,7 @@ import Testing @testable import OpenSwiftUI @_spi(ForOpenSwiftUIOnly) import OpenSwiftUICore -#if os(iOS) +#if os(iOS) || os(visionOS) import UIKit #endif @@ -31,7 +31,7 @@ struct ViewAliasTests { // } // } // } -// #if os(iOS) +// #if os(iOS) || os(visionOS) // let hostingView = _UIHostingView(rootView: ContentView()) // hostingView.render() // #endif diff --git a/Tests/OpenSwiftUI_SPITests/Overlay/CoreGraphics/CorePlatformImageTests.swift b/Tests/OpenSwiftUI_SPITests/Overlay/CoreGraphics/CorePlatformImageTests.swift index 4a87a3185..cb956afee 100644 --- a/Tests/OpenSwiftUI_SPITests/Overlay/CoreGraphics/CorePlatformImageTests.swift +++ b/Tests/OpenSwiftUI_SPITests/Overlay/CoreGraphics/CorePlatformImageTests.swift @@ -14,7 +14,7 @@ struct CorePlatformImageTests { @Test func nilCGImage() { let image: NSObject - #if os(iOS) + #if os(iOS) || os(visionOS) image = UIImage() #elseif os(macOS) image = NSImage(size: CGSize(width: 100, height: 100)) @@ -27,7 +27,7 @@ struct CorePlatformImageTests { @Test func nonNilCGImage() { let image: NSObject - #if os(iOS) + #if os(iOS) || os(visionOS) image = UIImage.add #elseif os(macOS) image = NSImage(named: NSImage.addTemplateName)! diff --git a/Tests/OpenSwiftUI_SPITests/Shims/CoreFoundationPrivateTests.swift b/Tests/OpenSwiftUI_SPITests/Shims/CoreFoundationPrivateTests.swift index 4588394de..cf9059147 100644 --- a/Tests/OpenSwiftUI_SPITests/Shims/CoreFoundationPrivateTests.swift +++ b/Tests/OpenSwiftUI_SPITests/Shims/CoreFoundationPrivateTests.swift @@ -15,7 +15,7 @@ struct CoreFoundationPrivateTests { #elseif targetEnvironment(simulator) #expect(result == false) #else - #if os(iOS) + #if os(iOS) || os(visionOS) #expect(result == true) #else #expect(result == false) diff --git a/Tests/OpenSwiftUI_SPITests/Shims/DyldPrivateTests.swift b/Tests/OpenSwiftUI_SPITests/Shims/DyldPrivateTests.swift index cc05fb16a..b0c9c84b8 100644 --- a/Tests/OpenSwiftUI_SPITests/Shims/DyldPrivateTests.swift +++ b/Tests/OpenSwiftUI_SPITests/Shims/DyldPrivateTests.swift @@ -18,7 +18,7 @@ struct DyldPrivateTests { version: .min )) == true) - #if os(iOS) + #if os(iOS) || os(visionOS) if #unavailable(iOS 19) { #expect(dyld_program_sdk_at_least(.init( platform: dyld_get_active_platform(), @@ -87,7 +87,7 @@ struct DyldPrivateTests { #if targetEnvironment(macCatalyst) #expect(platform == .MACCATALYST) #elseif targetEnvironment(simulator) - #if os(iOS) + #if os(iOS) || os(visionOS) #expect(platform == .IOSSIMULATOR) #elseif os(tvOS) #expect(platform == .TVOSSIMULATOR) @@ -99,7 +99,7 @@ struct DyldPrivateTests { preconditionFailure("Unsupported Darwin simulator platform") #endif #else - #if os(iOS) + #if os(iOS) || os(visionOS) #expect(platform == .IOS) #elseif os(macOS) #expect(platform == .MACOS) From becdcebeb67eae5498b6b4edb654518de6106959 Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 9 Sep 2025 02:00:17 +0800 Subject: [PATCH 2/5] Fix visionOS running issue --- Example/Example.xcodeproj/project.pbxproj | 2 ++ .../Button/ButtonStyle/TODO/BorderlessButtonStyle.swift | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj index 1870db6e6..d7d337e18 100644 --- a/Example/Example.xcodeproj/project.pbxproj +++ b/Example/Example.xcodeproj/project.pbxproj @@ -106,9 +106,11 @@ ); /Localized/Main.storyboard = ( ios, + xros, ); SceneDelegate.swift = ( ios, + xros, ); }; target = 27D49DF72BA604FB00F6E2E2 /* HostingExample */; diff --git a/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift b/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift index 793da95cf..87c75c535 100644 --- a/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift +++ b/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift @@ -108,7 +108,8 @@ struct OpacityButtonHighlightModifier: ViewModifier { func body(content: Content) -> some View { content - .opacity(highlighted ? pressedOpacity : 1.0) + // TODO: Fix visionOS build issue with opacity modifier +// .opacity(highlighted ? pressedOpacity : 1.0) // .contentShape(Rectangle(), eoFill: false) } } From 73e99d9fcc8aed92bc8529e3514fc31aa6e436b3 Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 9 Sep 2025 22:12:07 +0800 Subject: [PATCH 3/5] Add Animation support TODO: script to modify toolchain --- .../Integration/Hosting/UIKit/View/UIHostingViewBase.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift index 131bcc15c..3d8f562ba 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift @@ -812,7 +812,11 @@ final package class DisplayLink: NSObject { super.init() self.host = host #if os(visionOS) - // FIXME + // FIXME: setup a private SDK for visionOS build + link = window.screen.displayLink( + withTarget: self, + selector: #selector(displayLinkTimer(_:)) + ) #else link = window.screen.displayLink( withTarget: self, From 9f5c2f3d93f044a49dc75b6e22c92b9e86091a78 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sat, 13 Sep 2025 16:33:07 +0800 Subject: [PATCH 4/5] Add OPENSWIFTUI_INTERNAL_XR_SDK support --- Example/Example.xcodeproj/project.pbxproj | 52 ++++++++-------- Package.resolved | 4 +- Package.swift | 14 ++++- .../UIKit/OpenSwiftUITesting_Swizzles+UIKit.h | 2 + .../UIKit/OpenSwiftUITesting_Swizzles+UIKit.m | 2 +- .../UIKit/OpenSwiftUITesting_Swizzles.m | 2 +- .../Hosting/UIKit/View/UIHostingView.swift | 7 +-- .../UIKit/View/UIHostingViewBase.swift | 8 +-- .../TODO/BorderlessButtonStyle.swift | 2 +- .../CoreUI/CoreUI+UIUserInterfaceIdiom.m | 60 ++++++++++--------- .../Shims/UIKit/UIKit_Private.h | 2 + .../Shims/UIKit/UIKit_Private.m | 2 + 12 files changed, 86 insertions(+), 71 deletions(-) diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj index d7d337e18..3d74c4485 100644 --- a/Example/Example.xcodeproj/project.pbxproj +++ b/Example/Example.xcodeproj/project.pbxproj @@ -532,9 +532,10 @@ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = OpenSwiftUIDebug; }; @@ -636,10 +637,10 @@ PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = SwiftUIDebug; }; @@ -705,11 +706,11 @@ PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = SwiftUIRelease; }; @@ -775,11 +776,11 @@ PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = OpenSwiftUIDebug; }; @@ -845,11 +846,11 @@ PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = OpenSwiftUIRelease; }; @@ -938,9 +939,10 @@ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = SwiftUIRelease; }; @@ -1062,9 +1064,10 @@ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = OpenSwiftUIRelease; }; @@ -1117,10 +1120,10 @@ PRODUCT_BUNDLE_IDENTIFIER = org.OpenSwiftUI.OpenSwiftUIUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestingHost.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/TestingHost"; }; name = SwiftUIDebug; @@ -1139,10 +1142,10 @@ PRODUCT_BUNDLE_IDENTIFIER = org.OpenSwiftUI.OpenSwiftUIUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestingHost.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/TestingHost"; }; name = SwiftUIRelease; @@ -1161,10 +1164,10 @@ PRODUCT_BUNDLE_IDENTIFIER = org.OpenSwiftUI.OpenSwiftUIUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestingHost.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/TestingHost"; }; name = OpenSwiftUIDebug; @@ -1183,10 +1186,10 @@ PRODUCT_BUNDLE_IDENTIFIER = org.OpenSwiftUI.OpenSwiftUIUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestingHost.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/TestingHost"; }; name = OpenSwiftUIRelease; @@ -1276,9 +1279,10 @@ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = SwiftUIDebug; }; diff --git a/Package.resolved b/Package.resolved index 7267664d6..6af639721 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "2432e3fbb351913595eab925a316b1813a5e4b112660f54286c5b94f893e6fd1", + "originHash" : "9bd5f50dcfa75735a7e46a92248a1f4c358d021fa1af2222a0767d601b13d3b2", "pins" : [ { "identity" : "darwinprivateframeworks", @@ -7,7 +7,7 @@ "location" : "https://github.com/OpenSwiftUIProject/DarwinPrivateFrameworks.git", "state" : { "branch" : "main", - "revision" : "082d0abd12876636df553723e22a395a881f5491" + "revision" : "c94747dbacafafe8a649222b3bf00455c1c482d7" } }, { diff --git a/Package.swift b/Package.swift index af049a8c8..11eaaad5d 100644 --- a/Package.swift +++ b/Package.swift @@ -175,8 +175,8 @@ if libraryEvolutionCondition && !openCombineCondition && !swiftLogCondition { // MARK: - [env] OPENSWIFTUI_COMPATIBILITY_TEST let compatibilityTestCondition = envEnable("OPENSWIFTUI_COMPATIBILITY_TEST") -sharedCSettings.append(.define("OPENSWIFTUI", to: compatibilityTestCondition ? "0" : "1")) -sharedCxxSettings.append(.define("OPENSWIFTUI", to: compatibilityTestCondition ? "0" : "1")) +sharedCSettings.append(.define("OPENSWIFTUI", to: compatibilityTestCondition ? "1" : "0")) +sharedCxxSettings.append(.define("OPENSWIFTUI", to: compatibilityTestCondition ? "1" : "0")) if !compatibilityTestCondition { sharedSwiftSettings.append(.define("OPENSWIFTUI")) } @@ -186,6 +186,16 @@ if !compatibilityTestCondition { let ignoreAvailability = envEnable("OPENSWIFTUI_IGNORE_AVAILABILITY", default: !isSPIDocGenerationBuild && !compatibilityTestCondition) sharedSwiftSettings.append(contentsOf: [SwiftSetting].availabilityMacroSettings(ignoreAvailability: ignoreAvailability)) +// MARK: - [env] OPENSWIFTUI_INTERNAL_XR_SDK + +// Run @OpenSwiftUIProject/DarwinPrivateFrameworks repo's Scripts/install_internal_sdk.sh XRSimulator to install internal XRSimulator SDK +let internalXRSDK = envEnable("OPENSWIFTUI_INTERNAL_XR_SDK") +sharedCSettings.append(.define("OPENSWIFTUI_INTERNAL_XR_SDK", to: internalXRSDK ? "1" : "0")) +sharedCxxSettings.append(.define("OPENSWIFTUI_INTERNAL_XR_SDK", to: internalXRSDK ? "1" : "0")) +if internalXRSDK { + sharedSwiftSettings.append(.define("OPENSWIFTUI_INTERNAL_XR_SDK")) +} + // MARK: - OpenSwiftUISPI Target let openSwiftUISPITarget = Target.target( diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.h b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.h index 06d0cd24f..6e610796b 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.h +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.h @@ -15,11 +15,13 @@ OPENSWIFTUI_ASSUME_NONNULL_BEGIN +#if !OPENSWIFTUI_TARGET_OS_VISION || OPENSWIFTUI_INTERNAL_XR_SDK @interface UIScreen (OpenSwiftUITesting_Swizzles) + (void)_performOpenSwiftUITestingOverrides; - (CGFloat)_OpenSwiftUITesting_currentScreenScale; - (BOOL)_OpenSwiftUITesting_wantsWideContentMargins; @end +#endif @interface UICollectionView (OpenSwiftUITesting_Swizzles) + (void)_performOpenSwiftUITestingOverrides; diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.m b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.m index 5595b90c5..8cc00a564 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.m +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles+UIKit.m @@ -10,7 +10,7 @@ #if OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION -#if !OPENSWIFTUI_TARGET_OS_VISION +#if !OPENSWIFTUI_TARGET_OS_VISION || OPENSWIFTUI_INTERNAL_XR_SDK @implementation UIScreen (OpenSwiftUITesting_Swizzles) + (void)_performOpenSwiftUITestingOverrides { _SwizzleMethods(UIScreen.class, @selector(scale), @selector(_OpenSwiftUITesting_currentScreenScale)); diff --git a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.m b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.m index 475371501..bcbca1d55 100644 --- a/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.m +++ b/Sources/COpenSwiftUI/UIKit/OpenSwiftUITesting_Swizzles.m @@ -14,7 +14,7 @@ void _PerformTestingSwizzles() { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - #if !OPENSWIFTUI_TARGET_OS_VISION + #if !OPENSWIFTUI_TARGET_OS_VISION || OPENSWIFTUI_INTERNAL_XR_SDK [UIScreen _performOpenSwiftUITestingOverrides]; #endif [UICollectionView _performOpenSwiftUITestingOverrides]; diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift index 96f315b6a..3cb7a94c5 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift @@ -652,10 +652,7 @@ extension _UIHostingView: TestHost { extension UIDevice { package var screenSize: CGSize { - #if os(visionOS) - // FIXME - return .zero - #else + #if !os(visionOS) || OPENSWIFTUI_INTERNAL_XR_SDK let screenBounds = UIScreen.main.bounds let screenWidth = screenBounds.width let screenHeight = screenBounds.height @@ -677,6 +674,8 @@ extension UIDevice { finalHeight = screenHeight } return CGSize(width: finalWidth, height: finalHeight) + #else + return .zero #endif } } diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift index 3d8f562ba..f3ea4a765 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift @@ -811,13 +811,7 @@ final package class DisplayLink: NSObject { package init(host: UIHostingViewBase, window: UIWindow) { super.init() self.host = host - #if os(visionOS) - // FIXME: setup a private SDK for visionOS build - link = window.screen.displayLink( - withTarget: self, - selector: #selector(displayLinkTimer(_:)) - ) - #else + #if !os(visionOS) || OPENSWIFTUI_INTERNAL_XR_SDK link = window.screen.displayLink( withTarget: self, selector: #selector(displayLinkTimer(_:)) diff --git a/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift b/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift index 87c75c535..8f16e9631 100644 --- a/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift +++ b/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift @@ -110,6 +110,6 @@ struct OpacityButtonHighlightModifier: ViewModifier { content // TODO: Fix visionOS build issue with opacity modifier // .opacity(highlighted ? pressedOpacity : 1.0) -// .contentShape(Rectangle(), eoFill: false) + .contentShape(Rectangle(), eoFill: false) } } diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.m b/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.m index b9277d6e2..cb1bd9013 100644 --- a/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.m +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreUI/CoreUI+UIUserInterfaceIdiom.m @@ -24,35 +24,37 @@ CUIDeviceIdiom _CUIIdiomForIdiom(UIUserInterfaceIdiom idiom) { } CUISubtype _CUISubtypeForIdiom(UIUserInterfaceIdiom idiom) { -// switch (idiom) { -// case UIUserInterfaceIdiomPhone: { -// CGRect bounds = UIScreen.mainScreen._referenceBounds_openswiftui_safe_wrapper; -// double height = CGRectGetHeight(bounds); -// if (height > 667.0) { -// return CUISubtypeIPhonePlus; -// } else if (height > 568.0) { -// return CUISubtypeIPhone47Inch; -// } else if (height > 480.0) { -// return CUISubtypeIPhone4Inch; -// } else { -// return CUISubtypeNormal; -// } -// } -// case UIUserInterfaceIdiomPad: { -// CGFloat pointsPerInch = UIScreen.mainScreen._pointsPerInch_openswiftui_safe_wrapper; -// return pointsPerInch == 163.0 ? CUISubtypeIPadMini : CUISubtypeNormal; -// } -// case UIUserInterfaceIdiomTV: { -// CGRect bounds = UIScreen.mainScreen._referenceBounds_openswiftui_safe_wrapper; -// double height = CGRectGetHeight(bounds) * UIScreen.mainScreen.scale; -// return height < 1080.0 ? CUISubtypeAppleTVHD : CUISubtypeNormal; -// } -// case /* UIUserInterfaceIdiomWatch */ 4: return CUISubtypeAppleWatch38; -// case UIUserInterfaceIdiomVision: return CUISubtypeAppleVision; -// default: return CUISubtypeNormal; -// } - // FIXME: UIScreen - return CUISubtypeNormal; + #if !OPENSWIFTUI_TARGET_OS_VISION || OPENSWIFTUI_INTERNAL_XR_SDK + switch (idiom) { + case UIUserInterfaceIdiomPhone: { + CGRect bounds = UIScreen.mainScreen._referenceBounds_openswiftui_safe_wrapper; + double height = CGRectGetHeight(bounds); + if (height > 667.0) { + return CUISubtypeIPhonePlus; + } else if (height > 568.0) { + return CUISubtypeIPhone47Inch; + } else if (height > 480.0) { + return CUISubtypeIPhone4Inch; + } else { + return CUISubtypeNormal; + } + } + case UIUserInterfaceIdiomPad: { + CGFloat pointsPerInch = UIScreen.mainScreen._pointsPerInch_openswiftui_safe_wrapper; + return pointsPerInch == 163.0 ? CUISubtypeIPadMini : CUISubtypeNormal; + } + case UIUserInterfaceIdiomTV: { + CGRect bounds = UIScreen.mainScreen._referenceBounds_openswiftui_safe_wrapper; + double height = CGRectGetHeight(bounds) * UIScreen.mainScreen.scale; + return height < 1080.0 ? CUISubtypeAppleTVHD : CUISubtypeNormal; + } + case /* UIUserInterfaceIdiomWatch */ 4: return CUISubtypeAppleWatch38; + case UIUserInterfaceIdiomVision: return CUISubtypeAppleVision; + default: return CUISubtypeNormal; + } + #else + return CUISubtypeAppleVision + #endif } #endif /* (OPENSWIFTUI_TARGET_OS_IOS || OPENSWIFTUI_TARGET_OS_VISION) && OPENSWIFTUI_LINK_COREUI */ diff --git a/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.h b/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.h index 62d33a2e8..204d83aa5 100644 --- a/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.h +++ b/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.h @@ -36,10 +36,12 @@ OPENSWIFTUI_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) BOOL _canShowWhileLocked_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_canShowWhileLocked); @end +#if !OPENSWIFTUI_TARGET_OS_VISION || OPENSWIFTUI_INTERNAL_XR_SDK @interface UIScreen (OpenSwiftUI_SPI) @property (nonatomic, readonly) CGRect _referenceBounds_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_referenceBounds); @property (nonatomic, readonly) CGFloat _pointsPerInch_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_pointsPerInch); @end +#endif @interface UIWindowScene (OpenSwiftUI_SPI) @property (nonatomic, readonly) UIUserInterfaceStyle _systemUserInterfaceStyle_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_systemUserInterfaceStyle); diff --git a/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.m b/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.m index b4db2b122..93bbf94f4 100644 --- a/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.m +++ b/Sources/OpenSwiftUI_SPI/Shims/UIKit/UIKit_Private.m @@ -62,6 +62,7 @@ - (BOOL)_canShowWhileLocked_openswiftui_safe_wrapper { } @end +#if !OPENSWIFTUI_TARGET_OS_VISION || OPENSWIFTUI_INTERNAL_XR_SDK @implementation UIScreen (OpenSwiftUI_SPI) - (CGRect)_referenceBounds_openswiftui_safe_wrapper { OPENSWIFTUI_SAFE_WRAPPER_IMP(CGRect, @"_referenceBounds", CGRectZero); @@ -72,6 +73,7 @@ - (CGFloat)_pointsPerInch_openswiftui_safe_wrapper { return func(self, selector); } @end +#endif @implementation UIWindowScene (OpenSwiftUI_SPI) - (UIUserInterfaceStyle) _systemUserInterfaceStyle_openswiftui_safe_wrapper { From 590bcbb133da54546354d46b177c1ce35ce17f1c Mon Sep 17 00:00:00 2001 From: Kyle Date: Sat, 13 Sep 2025 16:36:08 +0800 Subject: [PATCH 5/5] Fix compile issue and dependency --- Package.resolved | 2 +- .../Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.resolved b/Package.resolved index 6af639721..0c1b98f95 100644 --- a/Package.resolved +++ b/Package.resolved @@ -16,7 +16,7 @@ "location" : "https://github.com/OpenSwiftUIProject/OpenAttributeGraph", "state" : { "branch" : "main", - "revision" : "989275d31790336e71080829256022b83e97a6ba" + "revision" : "f92b2c8afbf8ded48206a71f0060f80d6c389406" } }, { diff --git a/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift b/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift index 8f16e9631..87c75c535 100644 --- a/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift +++ b/Sources/OpenSwiftUI/View/Control/Button/ButtonStyle/TODO/BorderlessButtonStyle.swift @@ -110,6 +110,6 @@ struct OpacityButtonHighlightModifier: ViewModifier { content // TODO: Fix visionOS build issue with opacity modifier // .opacity(highlighted ? pressedOpacity : 1.0) - .contentShape(Rectangle(), eoFill: false) +// .contentShape(Rectangle(), eoFill: false) } }