Having trouble getting the correct bounds for my iPad application when launching it in landscape mode. I have the proper keys set in my Info.plist file, and my view controllers launch properly in landscape (and portrait, natch).
In my applicationDidFinishLaunching:
method I'm calling a selector after a 3 second delay, and that method makes a call to [[UIScreen mainScreen] applicationFrame]
, but it's returning me a portrait frame (ie height > width).
Does anyone know how to fix this? It smells like a bug to me (if so I'll file a radar), but if it's intended behaviour, where is it documented?
This is as designed. You should query the size of your superview and adjust as necessary.
[[UIScreen mainScreen] applicationFrame]
will always return the portrait rectangle even if the app is in landscape mode. This is related to the fact thatUIWindow
never actually rotates, but just changes the transform ofrootViewController.view
instead.To make sure, you can print the root view object in portrait and landscape modes, and you'll see something like this:
Portrait:
Landscape:
I got into same problem when dismissing view with dismissViewControllerAnimated in Cordova plugin. I modified singingAtom code for viewWillAppear method in MainViewController, which got resized after dismissing modal view:
When you are holding the iPad in landscape orientation and launch an app, the view controller initially sees bounds for a portrait view (even though orientation reports landscape). The view controller will then get a message to rotate to landscape orientation before it appears.
I never rely on
[[UIScreen mainScreen] applicationFrame]
, especially during app launch.When creating views in code, use the superview to set your frame.
If you're using xibs with "simulated interface elements" they will be correctly sized and everything will work great.
UINavigationController based apps
In the case of a UINavigationController based app, grab the frame directly from
self.navigationController.view
, don't try to use[self loadView]
andself.view.superview
. UINavigationController uses "hidden" subviews to do it's job--so the direct superview will not work.UINavigationController is special because during app launch, the navigation controller resizes your views after
loadView
gets called. When autoresizing kicks in you end up with a small margin at the bottom of the screen.Why not UIScreen
[[UIScreen mainScreen] applicationFrame]
doesn't work reliably (especially during app launch in landscape). My experience is that the viewcontroller'sinterfaceOrientation
property will not match theapplicationFrame
orientation.