62
задан 21 May 2010 в 16:11

11 ответов

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

[[UIDevice currentDevice] orientation]

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

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

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

[UIApplication sharedApplication].statusBarOrientation
133
ответ дан 31 October 2019 в 13:12

Я думаю

[[UIDevice currentDevice] orientation];

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

[[UIApplication sharedApplication]statusBarOrientation]; 

, и это работает отлично!

34
ответ дан 31 October 2019 в 13:12

Я нашел, что прием решил проблему ориентации 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

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

:D

- Chris Allinson

8
ответ дан 31 October 2019 в 13:12

Можно достигнуть этого двумя путями:

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, и согласно ему Вы умеете обойтись своя анимация в необходимой ориентации.

3
ответ дан 31 October 2019 в 13:12

Для определения среды по сравнению с портретом существует встроенная функция:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
2
ответ дан 31 October 2019 в 13:12

[UIApplication sharedApplication].statusBarOrientation портрет возвратов, когда это - среда и среда, когда это - портрет в запуске в iPad

1
ответ дан 31 October 2019 в 13:12

Я не знаю, почему, но каждый раз мое приложение запускается, первые 4 являются правильными, но впоследствии я получаю противоположную ориентацию. Я использую статическую переменную для подсчета этого, затем имею BOOL, чтобы зеркально отразить, как я вручную отправляю это в подпредставления.

Поэтому, в то время как я не добавляю новый автономный ответ, я говорю, что вышеупомянутое использования и имеет это в виду.Примечание: Я получаю ориентацию строки состояния, поскольку это - единственная вещь, которую называют, когда приложение запускается и является "достаточно правом", чтобы помочь мне переместить материал.

основной проблемой с использованием этого являются лениво загружаемые представления. Обязательно назовите свойство представления Вашего содержавшего и подпредставлений перед установкой их положений в ответ на их ориентацию. Благодарите Apple не катастрофический отказ, когда мы устанавливаем переменные, которые не существуют, вынуждая нас помнить, что они повреждают OO и вынуждают нас сделать это, также... gah, такая изящная система, все же так поврежденная! Серьезно, я люблю Собственный компонент, но это просто не хорошо, поощряет плохой дизайн OO. Не наш отказ, просто напомнив, что Ваш изменять размер функции мог бы работать, но Путь Apple требует, чтобы Вы загрузили представление использованием, не путем создания и инициализации его

0
ответ дан 31 October 2019 в 13:12

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

0
ответ дан 31 October 2019 в 13:12

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

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

- (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
ответ дан 31 October 2019 в 13:12

[UIDevice currentDevice].orientation работает отлично.

, НО!!!... прием должен добавить его к - (void)viewWillAppear:(BOOL)animated

exp:

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

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

<час>

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

-1
ответ дан 31 October 2019 в 13:12

Один из:

  • Проверка interfaceOrientation свойство активного контроллера представления.
  • [UIApplication sharedApplication].statusBarOrientation.
  • [UIDevice currentDevice].orientation. (Вы, возможно, должны звонить -beginGeneratingDeviceOrientationNotifications.)
9
ответ дан 31 October 2019 в 13:12

Другие вопросы по тегам:

Похожие вопросы: