iphone всегда возвращает UIInterfaceOrientationPortrait

#iphone #objective-c #ipad #orientation

#iPhone #objective-c #iPad #ориентация

Вопрос:

Мне нужно убедиться, что при UIViewController загрузке моего устройства оно вращается по мере необходимости.

Я внедрил shouldAutorotateToInterfaceOrientation методы, и все они работают нормально, за исключением случаев, когда приложение загружается впервые (когда iphone находится в альбомном режиме) или при переходе из UIViewController, который был в портретном режиме, interfaceOrientation и [[UIDevice currentDevice] orientation] всегда возвращает портретный режим!

Я читал блоги и даже некоторые вопросы SO, но ни один из них, похоже, не решает основную проблему.

Я использую стандартное приложение UINavigationController. Таким образом, первое представление — это первый помещенный контроллер в стек. Я также пытался задать self.NavigationController его ориентацию, но тоже безуспешно.

Мы высоко ценим любую помощь здесь.

РЕДАКТИРОВАТЬ: Вот мой код для отображения

 - (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[self navigationController] setNavigationBarHidden:YES animated:NO];

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];

if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
    [self setPortraitMode];
else
    [self setLandscapeMode];
}
  

РЕДАКТИРОВАТЬ 2

Вот как я распечатываю текущий

 UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
NSLog(@"currentDevice: %d", (int)orientation);
NSLog(@"statusbar: %d", (int)[UIApplication sharedApplication].statusBarOrientation);
NSLog(@"nav controller: %d", (int)self.navigationController.interfaceOrientation);
NSLog(@"interface orientation: %d", (int)self.interfaceOrientation);
  

Все они выводят «1»

но когда я помещаю этот код в willRotateToInterfaceOrientation метод, тогда они выводят правильные значения int (1,2,3 или 4).

Комментарии:

1. Вы когда-нибудь находили ответ на этот вопрос?

2. не могу точно вспомнить, но, посмотрев на ответы, я так не думаю : (

Ответ №1:

Вместо использования [[Ориентация текущего устройства UIDevice]] для проверки ориентации используйте ориентацию строки состояния, чтобы получить точную ориентацию:- [UIApplication sharedApplication].statusBarOrientation . У меня также возникла проблема при проверке ориентации текущего устройства, оно не всегда возвращает точную ориентацию

Комментарии:

1. вы вернули yes в shouldAutorotateToInterfaceOrientation?

2. есть ли у вас какой-либо родительский контроллер для этого контроллера представления, который не возвращает yes для shouldAutorotate. также проверьте это

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

4. эй, возможно, проблема в том, что вы обработали код setPotraitMode, или в представлении появится ландшафтный режим. Теперь viewWillAppear вызывается до того, как будет вызван метод shouldAutorate. Таким образом, изначально ориентация по умолчанию будет potrait при вызове viewWillAppear. Попробуйте обработать свой код в shouldAutorotate или didRotate . Это может решить вашу проблему. Поняли мою точку зрения? А также проверяйте ориентацию только с ориентацией строки состояния, а не с ориентацией текущего устройства

5. хорошая мысль, но, к сожалению, здесь не повезло, имеет ли значение, скрыта ли у меня строка состояния?

Ответ №2:

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

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

Комментарии:

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

2. Нет, я говорю, что ваше приложение всегда запускается в портретном режиме. Вот почему ориентация устройства — UIInterfaceOrientationPortrait в viewWillAppear. Проверьте поведение с помощью приложения Notes, если вы не уверены.

3. нет, в notes, если я открываю его в альбомном режиме, он начинается как книжный, но переключается в альбомный режим

4. Вы хотели знать, почему ориентация устройства всегда является UIInterfaceOrientationPortrait в viewWillAppear, и теперь вы знаете. Если у вас есть другие вопросы, вы должны задать их.

5. нет, первая строка в вопросе гласит I need to make sure that when my UIViewController loads, it rotates as needed. У меня все еще нет ответа на это

Ответ №3:

Как насчет проверки ориентации в viewDidAppear: вместо этого? Вы можете использовать ‘animated’, чтобы решить, будете ли вы поворачивать с анимацией или нет. Ваш просмотр может появляться, а затем поворачиваться, но я думаю, что это было бы приемлемо.

РЕДАКТИРОВАТЬ: в дополнение к моим комментариям, вот снимок экрана из Xcode 4 для UIInterfaceOrientation:

введите описание изображения здесь

Комментарии:

1. На всякий случай — вы добавили разрешенные вращения в свой список?

2. хм, нет, я этого не пробовал, какой ключ для этого?

3. ах, вы имели в виду, UIInterfaceOrientation что, если я правильно прочитал документы, предназначено для первоначального запуска, а это не то, что мне нужно здесь, я просто хочу обнаружить и настроить

4. Да — я имею в виду «UIInterfaceOrientation». Насколько я понимаю, речь идет о том, какие ориентации поддерживает ваше приложение, а не о первоначальном запуске. (смотрите редактирование моего поста)

5. на самом деле — я хочу сказать, что «UIInterfaceOrientation» касается как начальной, так и поддерживаемой ориентации.

Ответ №4:

Я работал с поворотами и ориентациями приложения iOS. Я обнаружил, что это self.interfaceOrientation всегда даст вам правильный результат, если вызывается в viewDidAppear или после этого.

[UIApplication sharedApplication].statusBarOrientation должно быть предпочтительным при добавлении представления непосредственно в UIWindow .

Надеюсь, это поможет.