Подтвердить что ты не робот

Получить начальную ориентацию iPad-приложения

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

В моем методе -application:didFinishLaunchingWithOptions: я проверяю ориентацию с помощью [[UIDevice currentDevice] orientation]. Проблема в том, что он всегда возвращает портрет, даже если приложение запускается в ландшафте. Есть ли способ обойти это?

4b9b3361

Ответ 1

Это ожидаемое поведение. Quoth документация UIViewController:

Примечание: Во время запуска приложения всегда должны устанавливать свой интерфейс в портретной ориентации. После возврата метода application:didFinishLaunchingWithOptions: приложение использует механизм вращения контроллера представления, описанный выше, для поворота представлений до соответствующей ориентации перед отображением окна.

Другими словами, что касается устройства, ориентация - портрет, когда приложение запускается. В какой-то момент после application:didFinishLaunchingWithOptions: он обнаружит различную ориентацию и вызовет ваш метод shouldAutorotateToInterfaceOrientation:, а затем ваш другие методы вращения вида, которые вы должны как обычно.

Ответ 2

Это лучший способ проверить ориентацию при запуске. Сначала создайте новый метод в AppDelegate, который проверяет ориентацию:

-(void)checkLaunchOrientation:(id)sender{

     UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;    
     BOOL isLandscape = UIDeviceOrientationIsLandscape(self.viewController.interfaceOrientation);

     if (UIInterfaceOrientationIsLandscape(orientation) || isLandscape) {
       //do stuff here
     }
}

В конце -application:didFinishLaunchingWithOptions: выполните

        [self performSelectorOnMainThread:@selector(checkLaunchOrientation:) withObject:nil waitUntilDone:NO];

Ответ 3

Используйте self.interfaceOrientation в вашем контроллере вида - это свойство UIViewController, которое устанавливается iOS для вас, а в некоторых случаях более надежным, чем [[UIDevice currentDevice] orientation].

Здесь подробное описание: http://bynomial.com/blog/?p=25

Ответ 4

Как упоминалось выше в блоге, существует набор макросов для тестирования ориентации. В этом сообщении в блоге упоминается UIDeviceOrientationIsPortrait. Мне нравится следующее ниже, это незначительный поворот.

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
{
  NSLog(@"Portrait");
}
else
{
  NSLog(@"Landscape");
}

Наблюдение, которое я сделал, заключается в том, что вы не можете вызвать этот код в виде таблицы, нажав на контроллер навигации, встроенный в контроллер разделенного представления. Другими словами, вы не можете вызывать его из контроллера главного представления. Вы должны заменить "self.interfaceOrientation" на splitviewcontroller.interfaceOrientation, предполагая, что вы поддерживаете ссылку на родительский контроллер представления разделов.

Ответ 5

Вместо этого используйте ориентацию состояния, чтобы ее обнаружить.

UIInterface Ориентация ориентации = [UIApplication sharedApplication].statusBarOrientation;

затем выполните if, если на "ориентации", которую вы получили сверху.

Ответ 6

Итак, вопрос заключается в проверке ориентации при запуске. Ответ печально "Вы не можете".

Но запуск ПОСЛЕ, вы можете проверить ориентацию обычным способом (как описано другими). ​​

Если кто-то еще придет сюда искать ответ, просто перестань смотреть, потому что при запуске переменная ориентации не установлена ​​(все представления фреймов/границ также сообщаются в портрете, даже если это не так).

Ответ 7

Вы хотите, чтобы вы установили правильные ключи в вашем Info.plist, чтобы разрешить нужные ориентации:

UISupportedInterfaceOrientations
    UIInterfaceOrientationPortrait
    UIInterfaceOrientationPortraitUpsideDown
    UIInterfaceOrientationLandscapeLeft
    UIInterfaceOrientationLandscapeRight

Ответ 8

Не то, чтобы вам нужен еще один ответ, но я подумал, что должен добавить, что вы почти никогда не хотите использовать [[UIDevice currentDevice] orientation]. Этот метод возвращает ориентацию устройства, что не обязательно совпадает с ориентацией интерфейса.

Ответ 9

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

вот что вам нужно сделать.

ваш первый UIViewController должен иметь специальную логику, чтобы набить нужную вам информацию.
вы даже можете создать UIStartupController только для этих целей, если это важно для вашего потока.
в случае моего проекта у нас уже был такой контроллер запуска.

все, что вам нужно, это следующий код

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    self.launchOrientation = UIDeviceOrientationUnknown;
  }
  return self;
}

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration
{
  [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

  if (self.launchOrientation == UIDeviceOrientationUnknown && duration > 0)
    self.launchOrientation = UIInterfaceOrientationPortrait;
  else
    self.launchOrientation = toInterfaceOrientation;
}

в принципе, если мы не запускаем в UIInterfaceOrientationPortrait, первая последовательность обратного вызова вращения фактически покажет ориентацию запуска.
если он запущен в UIInterfaceOrientationPortrait, тогда нам нужно проверить, что первая длительность вращения не равна нулю, а затем мы знаем, что она была запущена из портрета.