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

SupportInterfaceOrientations не работает на iOS 6 UIViewController

В iOS 5 мое приложение использовало метод для изменения моей ориентации:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

В iOS 6 Я думаю, что я должен это делать, но он ничего не делает! Мое приложение вращается не так, как я хочу.

- (BOOL) shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeRight;
}
4b9b3361

Ответ 1

Как я добавлял свой viewController.

Я заменил этот код строки:

[window addSubview:viewController.view];

по этой строке:

[window setRootViewController:viewController];

Ответ 2

Когда устройство меняет ориентацию, в iOS 6 система запрашивает приложение, какую ориентацию он поддерживает. Приложение вернет ряд ориентировок, которые он принимает.

Как приложение определяет ориентацию?

  • Сначала приложение проверяет ориентацию info.plist(это очень важно, чтобы определить, какую ориентацию использовать для запуска.
  • Во-вторых, он запрашивает делегат приложения для его ориентации, это можно определить с помощью метода -(NSUInteger)application:supportedInterfaceOrientationsForWindow:. Это эффективно отменяет настройку info.plist, эта реализация является необязательной. По умолчанию iPad-приложения ориентируются во всех направлениях и iPhone во всех, кроме с ног на голову.
  • Наконец, делегат приложения запрашивает его сверху большинства контроллеров, это может быть UINavigationController или UIViewController... и т.д., тогда он указывает, как быть представленным, и если он хочет авторотировать. Эти UIViewControllers могут использовать методы shouldAutorotate: и supportedInterfaceOrientations, чтобы сообщить делегату приложения, как его представить.

Вы должны убедиться, что вы установили контроллер корневого представления вашего окна.

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

Ответ 3

Для меня решение работало, дело было немного, потому что у меня был UINavigationController. Мое дело было в том, что мне нужно все окно "Портрет", кроме одного. Мне пришлось включить все ориентации ландшафта и портрета в цели (в противном случае он падает с единственным видом ландшафта).

Итак, в этом случае:

  • создать подкласс для UINavigationController,
  • вставьте туда ротационный характер.
  • и используйте подкласс вместо UINavigationController.

Ответ 4

Если вы используете UINavigationController, он отправляет сообщение supportedInterfaceOrientations: самому UINavigationController, а не контроллеру верхнего уровня (т.е. то, что вы на самом деле хотите сделать).

Вместо того, чтобы подзагонять UINavigationController, чтобы исправить это, вы можете просто добавить категорию в UINavigationController.

Ответ 5

Я создал новую переменную в моем singleton: canRotate, и я установил ее в YES, когда я хочу, чтобы viewcontroller поддерживал некоторую ориентацию.

В appDelegate я добавил следующее:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if([[SharedData sharedInstance] canRotate])
    {
        return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight);
    }
    return UIInterfaceOrientationMaskPortrait;
}

в моем случае это работает. У меня есть настраиваемая вкладка, и UINavigationviewControllers добавляются как подпрограммы в rootViewController.

Ответ 6

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