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?

Eyal
  • 10,777
  • 18
  • 78
  • 130
  • Try my answer. Maybe it will help. – rohan-patel Apr 06 '12 at 10:45
  • 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? – Cowirrie Apr 07 '12 at 22:48
  • Thanks for your help, yes the log print "Checking orientation 1". But I noticed something else, please check my updated question – Eyal Apr 08 '12 at 07:57
  • @Eyal: the additional console messages probably mean your code implements the old, and deprecated, [didAnimateFirstHalfOfRotationToInterfaceOrientation:](http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instm/UIViewController/didAnimateFirstHalfOfRotationToInterfaceOrientation:), and the similar willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: and willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:. You can probably do without these methods. – Cowirrie Apr 10 '12 at 13:51
  • @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? – Cowirrie Apr 10 '12 at 13:57
  • @Dondragmer: can it be that the old implementation of didAnimateFirstHalfOfRotationToInterfaceOrientation causes the problem? (I posted the complete method in my question) – Eyal Apr 12 '12 at 10:46
  • @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? – Cowirrie Apr 12 '12 at 11:03
  • @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' method – Eyal Apr 12 '12 at 11:46
  • @Eyal: Did you implement shouldAutorotateToInterfaceOrientation: for all your viewControllers? It only gets called on whichever one is active at the time. – Cowirrie Apr 12 '12 at 11:53
  • @Dondragmer: Yes of course, does shouldAutorotateToInterfaceOrientation supposed to be call every time I rotate the device? – Eyal Apr 12 '12 at 12:19
  • @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? – Cowirrie Apr 12 '12 at 12:24
  • @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. – Eyal Apr 12 '12 at 12:33
  • `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`? – Cowirrie Apr 12 '12 at 12:43
  • @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? – Eyal Apr 12 '12 at 13:34
  • @Eyal: Thank you. I've posted an answer, should you choose to accept it. – Cowirrie Apr 12 '12 at 13:38

4 Answers4

10

On the Target Summary choose portrait only.

Eric
  • 4,063
  • 2
  • 27
  • 49
  • try deleting the shouldAutorotateToInterfaceOrientation methods and keeping the target set correctly. – Eric Apr 05 '12 at 16:43
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>
rohan-patel
  • 5,772
  • 5
  • 45
  • 68
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.

Cowirrie
  • 7,218
  • 1
  • 29
  • 42
2

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

Jesse Naugher
  • 9,780
  • 1
  • 41
  • 56