Get current orientation of iPad?

后端 未结 11 1676
野趣味
野趣味 2020-12-02 07:28

In a given event handler (not the \"shouldAutorotateToInterfaceOrientation\" method) how do I detect the current iPad orientation? I have a text field I have to animate up

相关标签:
11条回答
  • 2020-12-02 07:59

    I think

    [[UIDevice currentDevice] orientation];
    

    is not really reliable. Sometimes it works, sometimes not... In my apps, I use

    [[UIApplication sharedApplication]statusBarOrientation]; 
    

    and it works great!

    0 讨论(0)
  • 2020-12-02 08:03

    I don't know why, but every time my app starts, the first 4 are right, but subsequently I get the opposite orientation. I use a static variable to count this, then have a BOOL to flip how I manually send this to subviews.

    So while I'm not adding a new stand-alone answer, I'm saying use the above and keep this in mind. Note: I'm receiving the status bar orientation, as it's the only thing that gets called when the app starts and is "right enough" to help me move stuff.

    The main problem with using this is the views being lazily loaded. Be sure to call the view property of your contained and subviews "Before" you set their positions in response to their orientation. Thank Apple for not crashing when we set variables that don't exist, forcing us to remember they break OO and force us to do it, too... gah, such an elegant system yet so broken! Seriously, I love Native, but it's just not good, encourages poor OO design. Not our fault, just reminding that your resize function might be working, but Apple's Way requires you load the view by use, not by creating and initializing it

    0 讨论(0)
  • 2020-12-02 08:06

    [UIDevice currentDevice].orientation works great.

    BUT!!! ... the trick is to add it to - (void)viewWillAppear:(BOOL)animated

    exp:

    (void)viewWillAppear:(BOOL)animated{
       ...
       BOOL isLandscape = UIInterfaceOrientationIsLandscape(self.interfaceOrientation);
       ...
    }
    

    If you call it at - (void)viewDidLoad, it does not work reliable, especially if you use multiple threads (main UI thread, background thread to access massive external data, ...).


    Comments: 1) Even if your app sets default orientation portrait, user can lock it at landscape. Thus setting the default is not really a solution to work around it. 2) There are other tasks like hiding the navigation bar, to be placed at viewWillAppear to make it work and at the same time prevent flickering. Same applies to other views like UITableView willDisplayCell -> use it to set cell.selected and cell.accessoryType.

    0 讨论(0)
  • 2020-12-02 08:07

    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

    0 讨论(0)
  • 2020-12-02 08:12

    One of:

    • Check the interfaceOrientation property of the active view controller.
    • [UIApplication sharedApplication].statusBarOrientation.
    • [UIDevice currentDevice].orientation. (You may need to call -beginGeneratingDeviceOrientationNotifications.)
    0 讨论(0)
  • 2020-12-02 08:12

    [UIApplication sharedApplication].statusBarOrientation returns portrait when it's landscape, and landscape when it's portrait at launch, in iPad

    0 讨论(0)
提交回复
热议问题