Create a ObservableObject Object like this
final class UserAndDeviceSettings: ObservableObject {
@Published var userInterfaceOrientationChanges:Bool = false
@Published var userInterfaceOrientationLandscape:Bool = false
}
Now go to your SceneDelegate and add a var on top and pass your settings var in UIHostingController in willConnectTo method.
var settings = UserAndDeviceSettings()
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
// Get the managed object context from the shared persistent container
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
// Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath
let contentView = ContentView().environment(\.managedObjectContext, context)
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
// read the initial device orientation here
self.settings.userInterfaceOrientationLandscape = (windowScene.interfaceOrientation.isLandscape == true)
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(self.settings))
self.window = window
window.makeKeyAndVisible()
}
}
and in didUpdate delegate method, add this code.
func windowScene(_ windowScene: UIWindowScene, didUpdate previousCoordinateSpace: UICoordinateSpace, interfaceOrientation previousInterfaceOrientation: UIInterfaceOrientation, traitCollection previousTraitCollection: UITraitCollection) {
print(">> previous tratis \(previousTraitCollection)")
print(">> previous coordinateSpace \(previousCoordinateSpace)")
print(">> previous orientation \(previousInterfaceOrientation)")
self.settings.userInterfaceOrientationChanges = true
if previousInterfaceOrientation == .portrait || previousInterfaceOrientation == .portraitUpsideDown {
self.settings.userInterfaceOrientationLandscape = true
} else {
self.settings.userInterfaceOrientationLandscape = false
}
}
Now you can use this @EnvironmentObject in any View
@EnvironmentObject var settings:UserAndDeviceSettings
if self.settings.userInterfaceOrientationLandscape {
}