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 ответа:
Будьте осторожны с тем, где вы решите представить свой модальный контроллер. У меня был опыт работы с некоторыми пользовательскими модальными контроллерами и настройки ориентации модального контроллера (и его теней!) в
- (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;