Question

I got this code that if the device is in landscape left/right or upside down it rotates and shows another view controller. but if it´s in the orientation face up or face down, then how can I tell if it´s in landscape mode or portrait? cause I only want to rotate if it´s face up or down and in landscape mode

    - (void)viewDidAppear:(BOOL)animated
    {
        UIDeviceOrientation orientation = [[UIDevice currentDevice]orientation];
        NSLog(@"orientation %d", orientation);
        if ((orientation == 2) || (orientation == 3) || (orientation == 4))
        {

            [self performSegueWithIdentifier:@"DisplayLandscapeView" sender:self];
            isShowingLandscapeView = YES;
    }
}
Was it helpful?

Solution 2

In UI code you usually should not depend on the device orientation but the user interface orientation. There's often a difference between them, for example when a view controller only supports portrait.

The most important difference for your case is that the interface orientation is never face up/down.

In your case you can just ask the view controller for the current user interface orientation: self.interfaceOrientation.

Your condition could be expressed somewhat like if (deviceOrientation is face up/down and interfaceOrientation is landscape)

Bear in mind that a device orientation landscape left means a user interface orientation landscape right.

OTHER TIPS

The interfaceOrientation property is deprecated since iOS 8. And the helpers methods

UIDeviceOrientationIsPortrait(orientation)  
UIDeviceOrientationIsLandscape(orientation)  

won't help either, because they return false when orientation is .faceUp.

So I ended checking this way:

extension UIViewController {
    var isPortrait: Bool {
        let orientation = UIDevice.current.orientation
        switch orientation {
        case .portrait, .portraitUpsideDown:
            return true
        case .landscapeLeft, .landscapeRight:
            return false
        default: // unknown or faceUp or faceDown
            guard let window = self.view.window else { return false }
            return window.frame.size.width < window.frame.size.height
        }
    }
}

This is in a UIViewController extension, so I can revert to comparing the screen width and height if everything else fails.

I use window because if the current ViewController is embedded in a container, it may not reflect the global iPad orientation.

Yes you can, the UIDeviceOrientation is an enum which contains:

 UIDeviceOrientationUnknown,
 UIDeviceOrientationPortrait,          
 UIDeviceOrientationPortraitUpsideDown,
 UIDeviceOrientationLandscapeLeft,     
 UIDeviceOrientationLandscapeRight,    
 UIDeviceOrientationFaceUp,            
 UIDeviceOrientationFaceDown    

There are even two helpers:

UIDeviceOrientationIsPortrait(orientation)  
UIDeviceOrientationIsLandscape(orientation) 

Just cmd on UIDeviceOrientation to show the headerfile where the enum is declared.

There is one way to check it.

UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
UIInterfaceOrientation statusBarOrientation =[UIApplication sharedApplication].statusBarOrientation;

Use the first one to check if the device is in faceup and second one will tell you if the device is in portrait or landscape.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top