Получить ориентацию запуска приложения для iPad - PullRequest
21 голосов
/ 04 августа 2010

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

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

Ответы [ 9 ]

36 голосов
/ 04 апреля 2011

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

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

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

19 голосов
/ 02 апреля 2011

Это лучший способ проверить ориентацию при запуске.Сначала создайте новый метод в 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];
13 голосов
/ 13 октября 2010

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

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

4 голосов
/ 07 августа 2011

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

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

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

2 голосов
/ 16 ноября 2010

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

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

, затем выполните операции if на «ориентации», которую вы получили выше.

1 голос
/ 20 июля 2012

Так что вопрос о проверке ориентации при запуске.К сожалению, ответ «Вы не можете».

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

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

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

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

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

ваш первый 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, то нам нужно проверить, что длительность первого поворота не равна нулю, а затем мы знаем, что он был запущен из портрета.

0 голосов
/ 02 апреля 2011

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

0 голосов
/ 04 августа 2010

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

UISupportedInterfaceOrientations
    UIInterfaceOrientationPortrait
    UIInterfaceOrientationPortraitUpsideDown
    UIInterfaceOrientationLandscapeLeft
    UIInterfaceOrientationLandscapeRight
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...