modalViewController представленный от UISplitViewController приходит вверх как неправильная ориентация


У меня есть UISplitViewController, который установлен в корневом представлении моего приложения. Когда viewDidLoad вызывается в моем левом контроллере вида, я делаю проверку, а затем представляю модальный контроллер вида, используя следующее:

SiteConfiguration *config = [[SiteConfiguration alloc] initWithStyle:UITableViewStyleGrouped];
config.firstLoad = YES;
UINavigationController *configNav = [[UINavigationController alloc] initWithRootViewController:config];
if ([Utility isIpad]) {
    configNav.modalPresentationStyle = UIModalPresentationFormSheet;
    configNav.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [[AppDelegate instance].splitViewController presentModalViewController:configNav animated:YES];
} else {
    [self presentModalViewController:configNav animated:YES];
}

Если iPad находится в ландшафтном режиме во время загрузки приложения, modalView отображается с неправильной ориентацией:

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

Я могу повернуть iPad, чтобы исправить это, но почему он загружается неправильно? У меня есть shouldAutorotateToInterfaceOrientation:, возвращающий YES в моем SiteConfiguration viewController. Что может быть причиной вот это?
2 2

2 ответа:

Будьте осторожны с тем, где вы решите представить свой модальный контроллер. У меня был опыт работы с некоторыми пользовательскими модальными контроллерами и настройки ориентации модального контроллера (и его теней!) в

 - (void)viewDidLoad:(BOOL)animated 

Не всегда вел себя так, как ожидалось.

Поместите свой код (presentModalViewController:configNav animated:YES) в

 - (void)viewDidAppear:(BOOL)animated 

Вместо этого. (Сделайте это также с любым кодом, который устанавливает фрейм вложенных представлений или выполняет любые манипуляции со слоями, например, с теневым слоем и свойствами тени).

Насколько я могу судить, вращение может быть незаметным для подвидов повернутого вида только после

 - (void)viewDidLoad:(BOOL)animated 
из-за проблем с потоками (один поток может начать рисовать вид вашего субвидения или модального контроллера до того, как вращение будет передано в субвидения (и модальные контроллеры) основным потоком). Кто-то с большим опытом работы с нитями, чем я, мог бы пролить на это больше света.

shouldAutorotateToInterfaceOrientation: на самом деле интерфейс не поворачивается, приложение делает это после получения уведомления UIDeviceOrientationDidChangeNotification.

Попробуйте добавить проверку ориентации устройства в методе -(void) viewDidAppear:(BOOL)animated.

Чтобы заставить интерфейс вращаться, используйте следующий фрагмент кода.

UIDeviceOrientation toInterfaceOrientation = [[UIDevice currentDevice] orientation];
[UIApplication sharedApplication].statusBarOrientation = toInterfaceOrientation;