2015-04-29 4 views
1

У меня есть приложение для iPhone с UIViewController в качестве первого контроллера. В нем у меня есть стандартные методы, которые заставляют его быть ландшафтом (см. Ниже).Ориентация Ошибка - Застрял в ландшафте

У меня также есть второе представление, которое я показываю как модальное в viewWillAppear - оно предназначено как экран заставки, когда я вытаскиваю содержимое из сети.

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

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

Любые предложения о том, как сохранить основной вид в портретном режиме при запуске приложения из ландшафта?

- (void)viewWillAppear:(BOOL)animated { 
    // Show the loading splash screen until the webview has completed 
    [self performSegueWithIdentifier:@"sgImageModal" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"sgImageModal"]) {  
     splashScreen.modalPresentationStyle = UIModalPresentationFullScreen;   
    } 
} 

- (BOOL)shouldAutorotate { 
    return NO; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    [self viewWillAppear:animated]; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    return UIInterfaceOrientationPortrait; 
} 

Update 1

В соответствии с предложениями, я переместил логику, чтобы отобразить модальный в viewDidAppear и viewDidLoad. Я также изменил shouldAutorotate, чтобы вернуть ДА. Не было и желаемого эффекта.

ответ

0

Вы не можете представить контроллер модального представления, пока контроллер текущего представления не завершит загрузку или не завершит его переход. В 90% случаев это означает, что вы должны представить контроллер модального вида в viewDidAppear:, а не viewWillAppear:. Проблема заключается в том, что когда код выполняется в viewWillAppear:, представление может не завершиться, его настройка (в том числе определение, какая ориентация для представления).

Here - удобный ответ Джейкоба Кнобеля, который объясняет, когда вызывается каждый цикл жизненного цикла.

Поэтому, если вы хотите, чтобы заставка появлялась сразу, сделайте ее без анимации, представляя ее от viewDidAppear:. При запуске приложения ваша мода должна появиться сразу.

Редактировать - Вы пробовали вернуть YES от shouldAutorotate? Вы указали поддерживаемые ориентации интерфейса и сказали, что он должен автоматически вращаться, если ориентация - портрет, однако вы сказали, что он не должен автоматически вращаться?

+0

Отчасти это верно. Фактически у вас есть контроллер представления, другой из 'viewDidLoad'. В этом случае методы 'viewWill | DidAppear' первого не вызывают до тех пор, пока второй не будет уволен. – rmaddy

+0

Вы можете, но это действительно не рекомендуется и может дать непредсказуемые результаты. Во время выполнения метод 'viewDidLoad' может быть вызван снова, например, если среда выполнения должна выпустить/перезагрузить контроллер в случае предупреждения о памяти. В этом случае ваш контроллер просмотра будет представлен снова, что не идеально! –

+0

Быстрое изменение моего кода, перемещающего это в viewDidAppear, по-прежнему вызывает отображение основного вида в ландшафте. – bugfixr