6

Both on iPhone simulator and iPhone 3GS (iOS 6) I cannot manage to set the orientation to portrait upside down. I have just one ViewController. I've added this code in it:

-(BOOL) shouldAutorotate{
 return YES; 
}

-(UIInterfaceOrientation) preferredInterfaceOrientationForPresentation{
 return UIInterfaceOrientationPortraitUpsideDown;
}

- (NSUInteger)supportedInterfaceOrientations{
 return UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown;
}

-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
  if (toInterfaceOrientation==UIInterfaceOrientationPortrait || toInterfaceOrientation==UIInterfaceOrientationPortraitUpsideDown) {
    return YES;
  }
 return NO;
}

I also added this to AppDelegate.m:

-(NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown;
}

I've also checked the plist file, both orientations are present there. On my storyboard, at Simulated Metrics Orientation is set to Inferred. I do nothing in my applicationDidFinishLaunchingWithOptions, except return YES. I've just added a UIImageView inside of this ViewController. Is it possible to make this orientation work?

Maxim Chetrusca
  • 3,262
  • 1
  • 32
  • 28

3 Answers3

11

supportedInterfaceOrientations returns an NSUInteger. It returns all of the interface orientations that the view controller supports, a mask of interface orientation values.

You need to return values defined in UIInterfaceOrientationMask Enum, like the following shows:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
}
Girish
  • 4,692
  • 4
  • 35
  • 55
Bejmax
  • 945
  • 7
  • 16
1

I know there's an answer that worked but for anyone else who's still stuck with the same issue:

I had a similar problem that was connected to Xcode: portrait rotations weren't being supported despite returning YES to - (BOOL) shouldAutorotateToInterfaceOrientation: for all cases. It turned out to be the enabled 'Supported Interface Orientations' in the summary window of my target's project editor:

enter image description here

The above 'iPhone/iPad Depoloyment Info' selections weren't doing it, it was the 'iPad Deployment Info' section that appears to control what the simulator will do despite the fact that I was only using the iPhone sim. Once I'd enabled the same orientations in that section then the iPhone simulation worked and I was able to test what happened when the simulator was rotated....

Todd
  • 1,770
  • 1
  • 17
  • 42
  • Is it just me or are the Landscape Left and Landscape Right graphics in XCode incorrect? Landscape Left from Apple documentation (https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIDevice_Class/Reference/UIDevice.html): UIDeviceOrientationLandscapeLeft = The device is in landscape mode, with the device held upright and the home button on the right side. The graphic for Landscape Left above shows the home button on the left side. Tested this on a device logging orientations and sure enough, Landscape left should have the home button on the right. – Jalakoo Jul 10 '13 at 22:03
  • So, UIDeviceOrientationLandscapeLeft and Right are OPPOSITE of UIInterfaceOrientationLandscapeLeft and Right. Compare docs above against docs for UIInterfaceOrientation: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIInterfaceOrientation. – Jalakoo Jul 16 '13 at 21:59
  • Good spot! Could the thinking be that the phobe and the cg interface have different anchor points and so are rotated relative to different origins...? But why!? – Todd Jul 17 '13 at 07:38
  • @Todd the thinking is more like the user interface rotation has to counteract on the device rotation. If the user interface would rotate to the left when you rotate the device to the left, you would end up looking at a user interface that is upside down. 90 degrees rotation of the device plus 90 degrees rotation of the user interface equals 180 degrees (upside down from where you started). To counteract the 90 degree device rotation you have to do -90 degrees on the user interface. This way what was up before the rotation would still be up after the rotation as 90+(-90) = 0. – kadam Dec 26 '14 at 16:38
0

I tried many ways for this. It seems only one way it works, but globally through the app, not only for particular view controller.

First, you have to check on Upside Down of Device Orientation in target general settings.

check Upside Down of Device Orientation

Then, in navigation controller extension, you override the supportedInterfaceOrientations method

extension UINavigationController {
    override public func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return .All
    }
}
Phu Nguyen
  • 261
  • 3
  • 6