Получить текущую ориентацию iPad? - PullRequest
62 голосов
/ 29 апреля 2010

В определенном обработчике событий (а не в методе shouldAutorotateToInterfaceOrientation) как определить текущую ориентацию iPad? У меня есть текстовое поле, которое я должен анимировать (когда появляется клавиатура) в альбомном виде, но не в портретном, и хочу узнать, в какой ориентации я нахожусь, чтобы увидеть, нужна ли анимация.

Ответы [ 11 ]

133 голосов
/ 29 апреля 2010

Информация об ориентации не очень последовательна, и существует несколько подходов. Если в контроллере представления вы можете использовать свойство interfaceOrientation. Из других мест можно позвонить:

[[UIDevice currentDevice] orientation]

Кроме того, вы можете запросить получение уведомлений об изменении ориентации:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];

Некоторые люди также любят проверять ориентацию строки состояния:

[UIApplication sharedApplication].statusBarOrientation
34 голосов
/ 04 июля 2011

Я думаю

[[UIDevice currentDevice] orientation];

не очень надежно. Иногда это работает, иногда нет ... В своих приложениях я использую

[[UIApplication sharedApplication]statusBarOrientation]; 

и прекрасно работает!

9 голосов
/ 29 апреля 2010

Один из:

  • Проверьте свойство interfaceOrientation активного контроллера представления.
  • [UIApplication sharedApplication].statusBarOrientation.
  • [UIDevice currentDevice].orientation. (Вам может потребоваться позвонить -beginGeneratingDeviceOrientationNotifications.)
8 голосов
/ 03 мая 2011

Я нашел трюк, чтобы решить проблему ориентации FaceUp !!!

Задержка проверки ориентации до ПОСЛЕ запуска приложения, затем установка переменных, размеров просмотра и т. Д. !!!

//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

Вы можете добавить подпункты, элементы позиционирования и т. Д. В функцию setStuff ... все, что изначально будет зависеть от ориентации !!!

: D

- Крис Аллинсон

3 голосов
/ 13 ноября 2012

Вы можете достичь этого двумя способами:

1 - используя следующий метод:

** Поместите следующую строку в метод -(void)viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil];

затем поместите этот метод в ваш класс

-(void)deviceRotated:(NSNotification*)notification
{

   UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
    {
        //Do your textField animation here
    }
}

Приведенный выше метод проверяет ориентацию при повороте устройства

2- Второй способ - вставить следующее уведомление внутри -(void)viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRotation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];

затем поместите следующий метод в ваш класс

-(void)checkRotation:(NSNotification*)notification
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
    {
         //Do your textField animation here
    }
}

Приведенный выше метод проверит ориентацию строки состояния ipad или iPhone, и в соответствии с ней вы заставите анимацию выполнить требуемую ориентацию.

2 голосов
/ 09 мая 2012

Для определения пейзажа и портрета есть встроенная функция:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
1 голос
/ 12 февраля 2013

[UIApplication sharedApplication].statusBarOrientation возвращает портрет в альбомной ориентации и альбом в вертикальной ориентации при запуске в iPad

0 голосов
/ 06 апреля 2013

Я перепробовал многие из вышеперечисленных методов, но мне казалось, что ничего не работает на 100%.

Мое решение состояло в том, чтобы сделать iVar, называемый ориентацией типа UIInterfaceOrientation, в Root View Controller.

- (void)viewDidLoad {

    [super viewDidLoad];
    orientation = self.interfaceOrientation; // this is accurate in iOS 6 at this point but not iOS 5; iOS 5 always returns portrait on app launch through viewDidLoad and viewWillAppear no matter which technique you use.
}


- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return YES;
}

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    orientation =  toInterfaceOrientation;

}

Тогда в любом месте, где вам нужно проверить ориентацию, вы можете сделать что-то вроде этого:

 if(UIInterfaceOrientationIsPortrait(orientation)){
    // portrait
  }else{
   // landscape
  }

Возможно, есть лучший способ, но он работает 98% времени (несмотря на iOS5) и не слишком сложен. Обратите внимание, что iOS5 всегда запускает iPad в книжной ориентации, затем отправляет устройству сообщения willRotateTo- и didRotateFromInterfaceOrientation:, поэтому значение все равно будет кратковременно неточным.

0 голосов
/ 16 ноября 2012

В вашем контроллере представления получите значение self.interfaceOrientation только для чтения (текущая ориентация интерфейса).

0 голосов
/ 27 апреля 2012

[UIDevice currentDevice].orientation прекрасно работает.

НО !!! ... хитрость в том, чтобы добавить его к - (void)viewWillAppear:(BOOL)animated

ехр:

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

Если вы позвоните по адресу - (void)viewDidLoad, он не будет работать надежно, особенно если вы используете несколько потоков (основной поток пользовательского интерфейса, фоновый поток для доступа к массивным внешним данным, ...)


Комментарии: 1) Даже если ваше приложение устанавливает ориентацию по умолчанию, пользователь может заблокировать его в альбомной ориентации. Таким образом, установка значения по умолчанию не является решением этой проблемы. 2) Существуют и другие задачи, такие как скрытие панели навигации, которая должна быть размещена в viewWillAppear, чтобы она работала и в то же время предотвращала мерцание. То же относится и к другим представлениям, таким как UITableView willDisplayCell -> использовать его для установки cell.selected и cell.accessoryType.

...