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!!!!
		// 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];
		case UIInterfaceOrientationLandscapeRight:
			[self rotate:90.0f];
		case UIInterfaceOrientationLandscapeLeft:
			[self rotate:-90.0f];
		case UIInterfaceOrientationPortrait:
			break; //do nothing because it's fine
	// 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.