8

As per the title. Calling [[UIDevice currentDevice] BeginGeneratingDeviceOrientationNotifications] has no effect.

DidRotateToInterfaceOrientation etc events are working fine, but I need to be able to poll the device orientation arbitrarily.

How can I fix/do this?

The long story: I have a tab application with a navigation controller on each tab. The root view of tab number one is a graph that goes full screen when the orientation changes to landscape; however this needs to be checked whenever the view appears as the orientation change could have occurred elsewhere, so I was hoping to poll the orientation state whenever this view appears.

Ben Zotto
  • 70,108
  • 23
  • 141
  • 204
Tobster
  • 345
  • 1
  • 3
  • 12

5 Answers5

9

UIDevice's notion of orientation seems to be only available on actual devices. The simulator seems to always return 0 here, regardless of whether the notifications have been enabled as the docs suggest. Irritatingly inconvenient, but there you go.

I find this works fine on the actual device:

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    NSLog(@"orientation: %d", [[UIDevice currentDevice] orientation]);
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
Ben Zotto
  • 70,108
  • 23
  • 141
  • 204
  • 1
    Yep, just wasted 2h trying to figure out what was wrong but indeed it was just the simulator. All working fine on the device. – samvermette Nov 12 '10 at 02:56
  • 5
    [[UIDevice currentDevice] orientation] does not work if the user has locked his device orientation from the Springboard. orientation is always the last value, and there are no notifications for changes. – Jeff Jul 16 '11 at 01:37
  • 5
    UIDeviceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; this alternative worked for me – iMeMyself Dec 11 '12 at 11:55
2

If you check [[UIDevice currentDevice] orientation] in - (void)viewDidLoad you will always get nil.

Check it in *- (void) viewDidAppear:(BOOL)*animated method and you

Jitendra
  • 5,055
  • 2
  • 22
  • 42
PavelTheMan
  • 31
  • 1
  • 3
2

seems like a silly question, but isn't it

beginGeneratingDeviceOrientationNotifications

( lower case b ) ...

DavidG
  • 1,796
  • 4
  • 21
  • 33
1

this is as per iMeMyself said in the comments above - this samed me a lot of time and I think is the right answer so I wanted to highlight it here:

UIDeviceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;

if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
{
   //do stuff here
}
else if (UIInterfaceOrientationIsPortrait(interfaceOrientation))
{
//or do stuff here
}
craigk
  • 1,294
  • 2
  • 12
  • 25
0

Wouldn't [[UIDevice currentDevice] orientation] give you the current orientation state? You could check for this in your viewWillAppear method of the view controller that wants to poll.

Edit: Other than that, there are various ways to get the current orientation, such as using the statusBarOrientation property in UIApplication, or interfaceOrientation property in UIViewcontroller.

David Liu
  • 9,426
  • 5
  • 40
  • 63
  • Looks like you didn't read the question. He's saying that method is returning NULL even though he's calling beginGeneratingOrientationNotifications. – Jasarien May 23 '10 at 21:29