Принудительная альбомная ориентация в одном контроллере представления

В iOS 5 и 6 я делал это в методе viewWillAppear в моем контроллере представления:

UIViewController *c = [[UIViewController alloc] init];
//To avoid the warning complaining about the view not being part of the window hierarchy
[[[TWNavigationManager shared] window] addSubview:c.view];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c.view removeFromSuperview];

Я также добавил этот метод в делегат приложения

- (NSUInteger)application:(UIApplication *)application      supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return [[TWNavigationManager shared] supportedInterfaceOrientationsForTopViewController];
}

Который в основном перенаправляет этот вызов на контроллер верхнего вида.

Это вызвало вызов методов автоматического поворота для моего контроллера представления, а затем я смог принудительно установить альбомную ориентацию только для этого контроллера представления. Теперь в iOS 7 этот код больше не работает. Белый вид появляется на весь экран.

Каким будет правильный подход в iOS7?

Заранее спасибо.


person mdonati    schedule 24.09.2013    source источник
comment
Откуда вы представляете этот lanscape-only-viewController? Это «толчок» в навигационном стеке? Или контроллер представления представлен модально? (в этом случае проще)   -  person Vinzzz    schedule 24.09.2013
comment
Да, это толчок в стеке навигации. Мой корневой контроллер представления — это UITabBarViewController, и каждый элемент имеет UINavigationController.   -  person mdonati    schedule 25.09.2013


Ответы (3)


Была та же проблема, и мне удалось ее исправить, отклонив представленный модальный вид с анимацией: ДА.

[self dismissViewControllerAnimated:YES completion:nil];

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

person Andrey Finayev    schedule 26.09.2013

Мое решение включает в себя то, что предложил Андрей Финаев, но мне также пришлось установить другой стиль перехода, иначе я получал пустой экран после завершения анимации закрытия.

UIViewController *mVC = [[UIViewController alloc] init];
mVC.modalPresentationStyle = UIModalPresentationFullScreen;
mVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self.navigationController presentViewController:mVC animated:NO completion:^{
    [self.navigationController dismissViewControllerAnimated:YES completion:^{

    }];
}];
person mdonati    schedule 14.11.2013

Чтобы предотвратить небольшое «мигание» от решения mdonia, я добавил dispatch_after и смог отклонить фиктивный модальный viewController с анимацией: НЕТ

UIViewController *dummyModalVC = [UIViewController new];
[dummyModalVC setModalPresentationStyle:UIModalPresentationFullScreen];
[dummyModalVC setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[dummyModalVC.view setBackgroundColor:[UIColor purpleColor]];

[self presentViewController:dummyModalVC animated:NO completion:^{
    double delayInSeconds = 0.001f;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [dummyModalVC dismissViewControllerAnimated:NO completion:^{}];
    });
}];

Выглядит, конечно, все еще как уродливый обходной путь, но я не нашел лучшего решения в данный момент… ;(

person Muscovado    schedule 11.12.2013