Проблема автоматического вращения iOS 6 - поддерживаетсяInterfaceOrientations возвращаемое значение не соблюдается

У меня есть приложение, где у меня есть подкласс UINavigationController как мой rootViewController. У меня есть UITableViewController, который позволяет пользователю редактировать некоторые настройки, он всегда должен находиться в портретном режиме. Мое приложение также должно поддерживать все другие ориентации после того, как я нажимаю компонент MoviePlayer на контроллер навигации.

Подкласс UITableViewController имеет эту реализацию supportedInterfaceOrientations:

- (NSUInteger)supportedInterfaceOrientations {
    LLog();
    return UIInterfaceOrientationMaskPortrait;
}

Команда logging сообщает мне, что это фактически вызвано.

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

Что делать, чтобы просмотр настроек всегда отображался в портрете, но разрешить изменения ориентации для просмотра видео?

Дополнительная информация: мой подкласс UINavigationController не переопределяет shouldAutorotate или supportedInterfaceOrientations. Я не реализовал

   - (NSUInteger)application:(UIApplication *)application 

supportedInterfaceOrientationsForWindow:(UIWindow *)window

в моем AppDelegate, и я включил все ориентации в итоговую сводку.

Ответ 1

У меня возникла проблема, что некоторые ViewControllers в стеке навигации поддерживают все ориентации, некоторые только портреты, но контроллер UINavigation возвращает все поддерживаемые приложениями ориентации, этот маленький взлом помог мне.

@implementation UINavigationController (iOS6OrientationFix)

-(NSUInteger) supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}

@end

Ответ 2

Вам также нужно добавить:

- (BOOL)shouldAutorotate {
    return NO;
}

и установите поддерживаемые вращения для контроллера представления root в файле plist приложения только portrait.

Ответ 3

Категория для UINavigationController не работает для меня. Я не знаю почему. Я решаю свою проблему с такой категорией UIViewController:

@implementation UIViewController (Orientation)

- (BOOL) shouldAutorotate
{
    return YES;
}


- (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger orientations = UIInterfaceOrientationMaskPortrait;

    if ([self isKindOfClass:[PlayerViewController class]])
    {

        orientations |= UIInterfaceOrientationMaskLandscapeLeft;
        orientations |= UIInterfaceOrientationMaskLandscapeRight;

    }

    return orientations;
}

@end