How to get current orientation of device programmatically in iOS 6?
Asked Answered
J

10

31

I have developed an iOS App and tested it on iOS6 device. While testing, I realized that my App is not responding to Orientation changes as expected.

Here is my Code:

// Autorotation (iOS >= 6.0)
- (BOOL) shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationMaskPortrait;
}

Precisely, I want to know that what Methods are called on Orientation Changes in iOS.

Joettajoette answered 12/12, 2012 at 9:26 Comment(7)
" my code is not working regarding orientation." means ?Cimbura
Actually I want to know which method called when I rotate my device..?Joettajoette
It'll call the shouldAutorotate method and supported interface orientation methodCimbura
@MidhunMP This method deprecated in iOS 6... That's why.Joettajoette
That's a misunderstanding, the shouldAutoRotate method is introduced instead of shouldAutorotateToInterfaceOrientation. And can be used in iOS5 and iOS 6Cimbura
Please check developer.apple.com/library/ios/#documentation/uikit/reference/… for more detailsCimbura
Possible duplicate of How to programmatically determine iPhone interface orientation?Harr
T
63

You can try this, may help you out:

How to change the device orientation programmatically in iOS 6

OR

Objective-c:

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]

Swift:

if UIDevice.current.orientation.isLandscape {
    // Landscape mode
} else {
    // Portrait mode
}
Tribromoethanol answered 12/12, 2012 at 9:29 Comment(2)
Note that The value of |orientation| property always returns 0 unless orientation notifications have been enabled by calling beginGeneratingDeviceOrientationNotifications. DocsMeredi
Note that this is not the same as getting the ViewController orientation, since it may be in landscape but UIDevice.current.orientation.isLandscape may still return false. In my case UIDevice.current.orientation was .faceUp.Couture
A
36

You can try this, which solves your problem.

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

Refer below link for App extension Get device current orientation (App Extension)

Ambit answered 12/12, 2012 at 9:33 Comment(7)
Following methods are called when you rotate the device. shouldAutorotateToInterfaceOrientation, didRotateFromInterfaceOrientation & willRotateToInterfaceOrientation.Ambit
Really bad idea. Don't hook on that property.Meredi
Some one can set this propery statusBarOrientation and it will be no longer the same as real interfaceOrientation. The status-bar orientation set by this method does not change if the device changes orientation.Meredi
@Meredi hows possible. We get the exact current orientation using this property. If we set the status bar orientation forcefully then its our responsibility to handled it carefully.Ambit
If you write some tool or framework you can't control all the code. So if you want to be sure that nobody did that, you should avoid it. IMHO.Meredi
@Meredi According to my point of view, if we write some tool or framework then its our responsibility to handle it accordingly.Ambit
I mean you can't control the code of whole app that uses your framework. Because you're writing framework, not the app. And developer can set and you won't know about it.Meredi
R
7

Maybe stupid but it is working (only in ViewController):

if (self.view.frame.size.width > self.view.frame.size.height) {
    NSLog(@"Hello Landscape");
}
Reclaim answered 8/9, 2015 at 10:38 Comment(1)
Amusingly effective.Unshod
T
6
  @property (nonatomic) UIDeviceOrientation m_CurrentOrientation ;

/* You need to declare these code in your ViewDidload or ViewWillAppear */

- (void)viewDidLoad

   {

   [super viewDidLoad];

   [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

   [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];
}

/* Now Our Device will give a notification whenever we change the orientation of our device,So you can control your code or program using the current orientation */

- (void)deviceOrientationDidChange:(NSNotification *)notification

 {

 //Obtaining the current device orientation

 /* Where self.m_CurrentOrientation is member variable in my class of type UIDeviceOrientation */

 self.m_CurrentOrientation = [[UIDevice currentDevice] orientation];

    // Do your Code using the current Orienation 

 }
Turkmen answered 6/6, 2013 at 9:56 Comment(2)
how to put check for Portrait and Landscape by using self.m_CurrentOrientation ?Ahead
if (UIDeviceOrientationIsLandscape(self.m_CurrentOrientation) { // code for landscape orientation }Turkmen
E
2

Follow the documentation on UIDevice.

You need to call

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

Then every time the orientation is changed you will receive a UIDeviceOrientationDidChangeNotification.

Endocrinology answered 12/12, 2012 at 9:59 Comment(0)
C
2

This tutorial gives a nice and simple overview of how to handle device rotation using UIDeviceOrientationDidChangeNotification. It should help you to understand how to use UIDeviceOrientationDidChangeNotification to be notified when the device orientation has changed.

Create answered 13/5, 2013 at 10:40 Comment(0)
S
2

Swift 5 answer

Subscribe to notifications on orientations changes:

override func viewDidLoad() {
   super.viewDidLoad()
    
   NotificationCenter.default.addObserver(self, selector: #selector(orientationChangedFromNotification), name: UIDevice.orientationDidChangeNotification, object: nil)
}

Handle notification:

@objc func orientationChangedFromNotification() {
   self.updateUIForOrientation()
}

Handle orientation changes:

func updateUIForOrientation() {
   let orientation = UIDevice.current.orientation
   
   //TODO: Your logic
}

Note: This will tell you the orientation of the physical device. It is also possible to access the interface orientation of the app:

UIApplication.shared.delegate?.window?.windowScene?.interfaceOrientation
Stacee answered 25/11, 2021 at 18:17 Comment(0)
U
1
UIDevice.current.orientation.isLandscape

The accepted answer reads the orientation of the device as above, which can be reported differently than the orientation of your view controller(s), particularly if your device is held in an almost horizontal position.

To get the orientation of your view controller specifically, you can use its interfaceOrientation property, which is deprecated since iOS 8.0 but still reports correctly.

Unshod answered 21/3, 2018 at 17:37 Comment(0)
C
0

In your ViewController, you can use didRotateFromInterfaceOrientation: method to detect when the device has been rotated and then do whatever you need in every orientation.

Example:

#pragma mark - Rotation

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    switch (orientation) {
        case 1:
        case 2:
            NSLog(@"portrait");
            // your code for portrait...
            break;

        case 3:
        case 4:
            NSLog(@"landscape");
            // your code for landscape...
            break;
        default:
            NSLog(@"other");
            // your code for face down or face up...
            break;
    }
}
Chainey answered 10/7, 2014 at 14:27 Comment(0)
M
0

Note that [UIDevice currentDevice] orientation] and Application sharedApplication].statusBarOrientation are deprecated.

Using the deviceOrientationDidChange notification seems to be the best regular way to get the current orientation, BUT it doesn't provide the orientation when the app starts, this was a problem for me.

So, in the ViewDidAppear method, I read the screen size to detect the first orientation:

CGSize __screenSize = [UIScreen];

To summarize, it works for me like this:

1/ By detecting the first orientation by reading the screen size in ViewDidAppear (not earlier).

2/ By detecting orientation changes using the “deviceOrientationDidChange” notification.

Good luck.

Manslaughter answered 2/9, 2023 at 16:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.