How to support only portrait mode on an iPhone app
Asked Answered
H

4

5

I have a strange problem in an iPhone app I'm developing. I want my app to support ONLY portrait mode, but for some reason I can't do it (device & simulator).

To support only portrait mode I did as follow:

  • In the TARGET summary section on Xcode, I chose only portrait.
  • All my ViewControllers implements shouldAutorotateToInterfaceOrientation

But as I said it won't work, and the strange result is that the app support ALL the orientations (portrait, upside down, landscape left, landscape right).
Any ideas?

this how I implement shouldAutorotateToInterfaceOrientation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
     // Return YES for supported orientations
     NSLog(@"Checking orientation %d", interfaceOrientation);
     return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

I notice just now that when I rotate the phone I get this message:

"Two-stage rotation animation is deprecated. This application should use the smoother single-stage animation."

What does it means?

Hamid answered 5/4, 2012 at 16:36 Comment(15)
Try my answer. Maybe it will help.Gully
Try adding NSLog(@"Checking orientation %d", interfaceOrientation); to your shouldAutorotateToInterfaceOrientation methods. Are any of them being called when you rotate the simulator or your device?Fated
Thanks for your help, yes the log print "Checking orientation 1". But I noticed something else, please check my updated questionHamid
@Eyal: the additional console messages probably mean your code implements the old, and deprecated, didAnimateFirstHalfOfRotationToInterfaceOrientation:, and the similar willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: and willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:. You can probably do without these methods.Fated
@Eyal: interfaceOrientation of 1 is UIInterfaceOrientationPortrait, which is what you're expecting. If that really happens when you're rotating to landscape, this is weirder than ever: the device returns YES because it thinks it's rotating to portrait. Can you post a complete shouldAutorotateToInterfaceOrientation method?Fated
@Dondragmer: can it be that the old implementation of didAnimateFirstHalfOfRotationToInterfaceOrientation causes the problem? (I posted the complete method in my question)Hamid
@Eyal: The didAnimate... methods should have no effect. shouldAutorotateToInterfaceOrientation: is all that matters. What gets logged if you turn your device to each of the four orientations? Does it display Checking orientation 1 four times?Fated
@Dondragmer: I was sure that I got 'Checking orientation 1' every time I rotate the device before, but now I see that I only get it the first time the viewController become visible, but when I rotate the device(or simulator) I only get the "Two-stage rotation animation is deprecated..." with no call to the 'shouldAutorotateToInterfaceOrientation' methodHamid
@Eyal: Did you implement shouldAutorotateToInterfaceOrientation: for all your viewControllers? It only gets called on whichever one is active at the time.Fated
@Dondragmer: Yes of course, does shouldAutorotateToInterfaceOrientation supposed to be call every time I rotate the device?Hamid
@Eyal: Yes, but it will only be called on whichever viewController is in the foreground. How many viewControllers do you have? Do their shouldAutorotateToInterfaceOrientation: methods all contain this logging statement?Fated
@Dondragmer: Yes I copy-paste this method for all of them. I have 3 main viewControllers that are loaded when the app launch and used within a UITabBarController.Hamid
UITabBarController is itself a ViewController. The default implementation seems to respond to shouldAutorotateToInterfaceOrientation: by querying its subviews, but if you created your own subclass of UITabBarController, it may have its own version. Did you subclass UITabBarController?Fated
@Dondragmer: You are a genius! Yes I subclass UITabBarController although I didn't implemented shouldAutorotateToInterfaceOrientation in it, but when I did implemented it with UIInterfaceOrientationPortrait it worked! Thanks for your patience, can I rate your answer somehow?Hamid
@Eyal: Thank you. I've posted an answer, should you choose to accept it.Fated
F
4

It is possible to have multiple ViewControllers on the screen. The UITabBarController is itself a UIViewController, and it only passes shouldAutorotateToInterfaceOrientation: requests to the viewControllers within if it chooses. The default implementation does this, but if you subclass it, the code XCode generates (as of iOS 5.1) does not.

Fated answered 12/4, 2012 at 13:37 Comment(0)
P
10

On the Target Summary choose portrait only.

Petitioner answered 5/4, 2012 at 16:37 Comment(1)
try deleting the shouldAutorotateToInterfaceOrientation methods and keeping the target set correctly.Petitioner
G
5

Go to info.plist file. Right Click open it as source code. And look for this line. For me in iPad its like this:

  <key>UISupportedInterfaceOrientations~ipad</key>

Delete all other orientation and keep the only one which you need..Like this :

    <array>

    <string> UIInterfaceOrientationPortrait </string>

</array>
Gully answered 5/4, 2012 at 18:9 Comment(0)
F
4

It is possible to have multiple ViewControllers on the screen. The UITabBarController is itself a UIViewController, and it only passes shouldAutorotateToInterfaceOrientation: requests to the viewControllers within if it chooses. The default implementation does this, but if you subclass it, the code XCode generates (as of iOS 5.1) does not.

Fated answered 12/4, 2012 at 13:37 Comment(0)
V
2

check your plist and make sure the key there is set correctly.

Vanquish answered 5/4, 2012 at 16:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.