How to determine iOS device orientation when your app starts up.

I’ve been working on several iPad apps lately that require a loading screen to appear right after launch. All the apps are designed to work in any rotation so getting things to startup in the correct orientation has been a challenge because of some iOS “bugs” with device orientation at startup.

After several attempts of trial and error I believe the following is a foolproof solution for setting the correct orientation of the startup view for an iPad app (assuming the default view was design in portrait orientation). I thought I’d share it here for anyone else who is having a similar problem.

First, in application:didFinishLaunchingWithOptions: add the following:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

   // The rest of your code...

}

then, on the view you want to rotate, check both interface and device orientation to properly position the view in all four orientations (plus laying flat on a table).

-(void)updateOrientation {

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

    bool landscape;

    if (dOrientation == UIDeviceOrientationUnknown || dOrientation == UIDeviceOrientationFaceUp || dOrientation == UIDeviceOrientationFaceDown) {
        // If the device is laying down, use the UIInterfaceOrientation based on the status bar.
        landscape = UIInterfaceOrientationIsLandscape(iOrientation);
    } else {
        // If the device is not laying down, use UIDeviceOrientation.
        landscape = UIDeviceOrientationIsLandscape(dOrientation);

        // There's a bug in iOS!!!! http://openradar.appspot.com/7216046
        // So values needs to be reversed for landscape!
        if (dOrientation == UIDeviceOrientationLandscapeLeft) iOrientation = UIInterfaceOrientationLandscapeRight;
        else if (dOrientation == UIDeviceOrientationLandscapeRight) iOrientation = UIInterfaceOrientationLandscapeLeft;

        else if (dOrientation == UIDeviceOrientationPortrait) iOrientation = UIInterfaceOrientationPortrait;
        else if (dOrientation == UIDeviceOrientationPortraitUpsideDown) iOrientation = UIInterfaceOrientationPortraitUpsideDown;
    }

    if (landscape) {
        // Do stuff for landscape mode.
    } else {
        // Do stuff for portrait mode.
    }

    // Now manually rotate the view if needed.
    switch (iOrientation) 
    {
        case UIInterfaceOrientationPortraitUpsideDown:
            [self rotate:180.0f];
            break;
        case UIInterfaceOrientationLandscapeRight:
            [self rotate:90.0f];
            break;
        case UIInterfaceOrientationLandscapeLeft:
            [self rotate:-90.0f];
            break;
        case UIInterfaceOrientationPortrait:
            break; //do nothing because it's fine
        default:
            break;
    }

    // Set the status bar to the right spot just in case
    [[UIApplication sharedApplication] setStatusBarOrientation:iOrientation];

}

Enjoy. If you found it useful or have an improvement, let me know.