Сохранение ориентации родительского представления после модального представления было представлено с различной ориентацией

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

У меня есть следующий код в моем делете приложения, чтобы разрешить изменения ориентации только для одного модального представления (GalleryPhotoViewer):

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;

    if(self.window.rootViewController){
        UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];

        //Support Portrait mode only on Photoviewer
        if ([[presentedViewController presentedViewController] isKindOfClass:GalleryPhotoViewController.class] ) {
            orientations = UIInterfaceOrientationMaskAll;
        }else{
            orientations = [presentedViewController supportedInterfaceOrientations];

        }
    }

    return orientations;
}

Из родительского класса (PhotosViewController) я звоню:

GalleryPhotoViewController *gpView = [GalleryPhotoViewController new];
[self presentViewController:gpView animated:YES completion:nil];

Также в моем родительском (и других представлениях) у меня есть следующий код, чтобы запретить портретный режим:

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if(interfaceOrientation == UIInterfaceOrientationPortrait) {
       return YES;
    } else {
        return NO;
    }
}

Любые идеи о том, как я могу сохранить ориентацию на родительском представлении? Я думал о возможно просто программном изменении ориентации на родителя в методе viewWillAppear после отклонения модальности, но тогда я не знал бы, какова была предыдущая ориентация, не говоря уже о том, что я не смог найти код для этого независимо от ios6.

EDIT/SOLUTION: Итак, я нашел решение и то, что я закончил, оставил приложение: supportedInterfaceOrientationsForWindow: код и просто добавление подкласса UINavigation к родительскому представлению, представляющему модальное представление, и все работало как ожидалось, а родительский сохранил свою первоначальную ориентацию, в то время как модальная способность могла свободно меняться.

В моем родителе:

//To make sure that this view remains in Landscape
@implementation UINavigationController (Rotation_IOS6)

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

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

@end

Спасибо @matt за предложения.

Ответ 1

Я думаю, что проблема заключается в использовании application:supportedInterfaceOrientationsForWindow:. Вместо этого избавиться от этого и начать с подкласса UINavigationController и сделать класс контроллера корневого представления, который является вашим навигационным интерфейсом. Тогда:

  • В подклассе UINavigationController верните UIInterfaceOrientationMaskLandscape из supportedInterfaceOrientations.

  • В представленном (модальном) контроллере представлений верните UIInterfaceOrientationMaskAll из supportedInterfaceOrientations.