iosswiftuiinterfaceorientationviewwilltransitiontosize

UIView.isHidden not working when changing orientation using viewWillTransition


I'm trying to change orientation with just one view, the rest are anchored to Portrait. I've set a method in my AppDelegate as below

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if globalVariables.gIsDosageView == "Y" {
        if UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight {
            return UIInterfaceOrientationMask.all;
        } else {
            return UIInterfaceOrientationMask.portrait;
        }
    } else {
        return UIInterfaceOrientationMask.portrait;
    }
}

The global variable gIsDosageView is set to "Y" when the Dosage view is selected. I've created two separate views, portraitView (375x812) and landscapeView (812x375). I've used the viewWillTransition method to catch each change in orientation as below

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if size.width < 400 {
        self.userImg.isHidden = false
        self.deviceImg.isHidden = false
        self.portraitView.isHidden = false
        self.landscapeView.isHidden = true
    }
    else {
        self.userImg.isHidden = true
        self.deviceImg.isHidden = true
        self.portraitView.isHidden = true
        self.landscapeView.isHidden = false
    }
}

When I go from the main screen to Dosage it displays the correct screen and will toggle between both orientation views without issue. However, if I go to another screen and come back to the Dosage screen it only shows the screen that was first loaded in both orientation screens. I've stepped through the code and it hides the right screens but this is not reflected in the resulting view. If I select the screen in portrait first, it will toggle successfully between portrait and landscape but if I go to the next screen and return to Dosage, it will only show the Portrait screen regardless of orientation and appears to ignore the code in viewWillTransition().

Why is this and what have I missed?


Solution

  • viewWillTransition is only called when the device is rotated. When you switch between open views without rotating, it won't get called, so won't set the view up how you want it. Try putting the test in viewWillAppear instead.