2014-09-20 2 views
3

У меня есть представленный контроллер представлений, который поддерживает все ориентации интерфейса. Однако контроллер представления представления должен поддерживать только портретный режим.Режим принудительного портрета при отклонении представленного контроллера представления

Пока все хорошо.

Однако в iOS8, когда я отключаю контроллер вида WHILE в ландшафтном режиме, сохраняется режим ландшафта. И так как у меня есть shouldAutorotate, установленный на NO, он никогда не поворачивается назад.

Вопрос: Как я могу заставить презентацию VC вернуться к портрету?

я в настоящее время этот способ реализован:

- (BOOL)shouldAutorotate 
{ 
    if ([self interfaceOrientation] != UIInterfaceOrientationPortrait) 
    { 
    return YES; 
    } 
    else 
    { 
    return NO; 
    } 
} 

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

Но это выглядит некрасиво, пока пользователь не поворачивает свой телефон.

Как его заставить?

ответ

0

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

UIInterfaceOrientation orientation = [[UIApplication 
    sharedApplication] statusBarOrientation]; 

if (orientation != UIInterfaceOrientationPortrait) { 

    // HACK: setting the root view controller to nil and back again "resets" 
    // the navigation bar to the correct orientation 
    UIWindow *window = [[UIApplication sharedApplication] keyWindow]; 
    UIViewController *vc = window.rootViewController; 
    window.rootViewController = nil; 
    window.rootViewController = vc; 

} 

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

1

У нас была точно такая же проблема. Вы можете повернуть его программным кодом -

if ([UIApplication sharedApplication].statusBarOrientation != UIInterfaceOrientationPortrait) { 
    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; 
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 
} 

Есть 2 возможных варианта -

1), прежде чем отклонить представленный ViewController, поворачиваются к портрету, если необходимое

2) после отклоните, поверните на портрет в «viewDidAppear» представляющего viewController.

Одна проблема с этим, что вы не можете передать блок завершения, но вы можете использовать следующую функцию обратного вызова в iOS8:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    if (self.needToDismissAfterRotatation) 
     self.needToDismissAfterRotatation = NO; 
     [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
     } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
      // dismiss 
     }]; 
    } 
} 

Кстати, в iOS8 яблоко сделал огромное изменение в по мере поворота экрана, когда приложение вращается, экран вращается, и все элементы в UIWindow вращаются также, поэтому, когда представленный viewController поворачивается в альбомный, также отображается отображающий viewController, даже если он поддерживает только портрет. ,

Мы боролись с этой проблемой в течение многих дней, наконец, мы пришли к решению поставить представленный ViewController в новом UIWindow, и таким образом он держит Представляющий ViewController в портретном всего времени

пример проект для этого: "modalViewController" in UIWindow


+1

сэр, вы спасли мою жизнь – PaulRBerg