在关闭呈现的视图控制器时强制纵向模式

时间:2014-09-20 16:21:30

标签: uiviewcontroller ios8 device-orientation

我有一个支持所有界面方向的视图控制器。但是,呈现视图控制器应仅支持纵向模式。

到目前为止一切顺利。

然而,在iOS8中,当我在横向模式中关闭视图控制器WHILE时,横向模式保持不变。由于我shouldAutorotate设置为NO,因此永远不会回转。

问题是,如何强制呈现VC返回肖像?

我目前已实施此解决方法:

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

它允许将设备移动到纵向,并且它将保留在此处,因为在它的纵向自动旋转被禁用之后。

但在用户转动手机之前,它看起来很难看。

如何强迫它?

2 个答案:

答案 0 :(得分:2)

我们遇到了完全相同的问题。 您可以通过代码以编程方式旋转它 -

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

有两种可能的选择 -

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的肖像 < / p>

示例项目: "modalViewController" in UIWindow


答案 1 :(得分:0)

此代码将强制UI回到纵向,假设您尝试强制纵向的视图控制器已经是根视图控制器(如果它不是根视图,则此代码将恢复根视图控制器,但没有任何其他已推送到其上的视图控制器):

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;

}

它不是很漂亮,因为它在顶级视图控制器被解散后突然跳跃,但它比在风景中留下更好。