Rotation only in one ViewController

后端 未结 13 1880
我在风中等你
我在风中等你 2020-12-05 03:20

I am trying to rotate one view while all other views (5) are fixed to portrait. The reason is that in that one view I want the user to watch pictures which he saved before.

13条回答
  •  不思量自难忘°
    2020-12-05 04:08

    Sometimes when you're using a custom navigation flow (that may get really complex) the above-mentioned solutions may not always work. Besides, if you have several ViewControllers that need support for multiple orientations it may get quite tedious.

    Here's a rather quick solution I found. Define a class OrientationManager and use it to update supported orientations in AppDelegate:

    class OrientationManager {
        static var landscapeSupported: Bool = false
    }
    

    Then in AppDelegate put the orientations you want for that specific case:

    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
            if OrientationManager.landscapeSupported {
                return .allButUpsideDown
            }
            return .portrait
        }
    

    Then in the ViewControllers that you want to have multiple navigations update the OrientationManager:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        OrientationManager.landscapeSupported = true
    }
    

    Also, don't forget to update it once again when you'll be exiting this ViewController:

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        OrientationManager.landscapeSupported = false
        //The code below will automatically rotate your device's orientation when you exit this ViewController
        let orientationValue = UIInterfaceOrientation.portrait.rawValue
        UIDevice.current.setValue(orientationValue, forKey: "orientation")
    }
    

    Hope this helps!

    Update:

    You may just want to add a static func to your Orientation Support Manager class:

        static func setOrientation(_ orientation: UIInterfaceOrientation) {
            let orientationValue = orientation.rawValue
            UIDevice.current.setValue(orientationValue, forKey: "orientation")
            landscapeSupported = orientation.isLandscape
        }
    

    Then you can call this function whenever you need to set the orientation back to portrait. That will also update the static landscapeSupported value:

    OSM.setOrientation(.portrait)
    

提交回复
热议问题