Andrew Johnson
Andrew Johnson

Reputation: 13286

No perfect way to detect device orientation on iPad?

EDIT: The given answer works on the device, but beware it fails on the simulator.

When my iPad starts up, I show a loading label, centered in the middle of the screen. I set its autoresizingMask so it recenters on orientation change.

As the app starts up, the label's text changes, so I want to recenter the label based on its new length. However, the following piece of code doesn't center the label correctly:

- (void) setLabelText:(NSString*)text {
  CGSize maximumLabelSize = CGSizeMake(500,20);
  CGSize expectedLabelSize = [text sizeWithFont:loadingLabel.font
                              constrainedToSize:maximumLabelSize
                                  lineBreakMode:loadingLabel.lineBreakMode];
  loadingLabel.frame = CGRectMake(self.view.frame.size.width/2-expectedLabelSize.width/2,
                                  loadingLabel.frame.origin.y, 
                                  expectedLabelSize.width, 
                                  loadingLabel.frame.size.height);
  loadingLabel.text = text;
}

I also considered checking [[UIDevice currentDevice]orientation], and if the iPad is in landscape mode, then I'd use self.view.frame.size.height to set the xOrigin of the label.

However, if the device is face up or face down, (and not landscape or portrait) then this method fails. I also have a lastOrientation variable in my appDelegate, which remembers if the app is in landscape or portrait, even when face up or face down, based on the device's last known orientation. However, at start-up, this variable isn't necessarily set.

Is there some simple solution I am missing here, so I can resize and center my label?

EDIT: I tried checking UIStatusBarOrientation based on the advice posted, but it doesn't work:

if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft
    || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) {
  NSLog(@"landscape");  
  width = self.view.frame.size.height;
} else {
  NSLog(@"portrait");   
}

This always logs portrait, at least on start-up, on the simulator.

Upvotes: 1

Views: 4162

Answers (2)

Chris Allinson
Chris Allinson

Reputation: 1872

I found a trick to solve the FaceUp orientation issue!!!

Delay the orientation check till AFTER the app has started running, then set variables, view sizes, etc.!!!

//CODE

- (void)viewDidLoad {

  [super viewDidLoad];

  //DELAY
  [NSTimer scheduledTimerWithTimeInterval:0.5 
                     target:self 
                     selector:@selector(delayedCheck) 
                     userInfo:nil 
                     repeats:NO];

}


-(void)delayedCheck{

  //DETERMINE ORIENTATION
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait ){
      FACING = @"PU";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown ){
      FACING = @"PD";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft ){
      FACING = @"LL";
  }
  if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight ){
      FACING = @"LR";
  } 
  //DETERMINE ORIENTATION

  //START
  [self setStuff];
  //START

}


-(void)setStuff{

  if( FACING == @"PU" ){
          //logic for Portrait
  }
  else
  if( FACING == @"PD" ){
          //logic for PortraitUpsideDown
  }
  else{ 
  if( FACING == @"LL"){
          //logic for LandscapeLeft
  }
  else
  if( FACING == @"LR" ){
          //logic for LandscapeRight
  }

}

//CODE

You can addSubviews, position elements, etc. in the 'setStuff' function ... anything that would initially depend on the orientation!!!

:D

-Chris Allinson

Upvotes: 0

Mark Adams
Mark Adams

Reputation: 30846

Check [[UIApplication sharedApplication] statusBarOrientation]

Upvotes: 2

Related Questions