SwiftUI Know When Entering Landscape Mode

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 {
    
}
Spread the love
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •