UIWindow 的根视图控制器在应用启动时不会旋转到横向

Posted

技术标签:

【中文标题】UIWindow 的根视图控制器在应用启动时不会旋转到横向【英文标题】:UIWindow's root view controller does not rotate to landscape at app launch 【发布时间】:2012-04-10 21:22:33 【问题描述】:

我正在开发一个基于 xib 的纯横向应用程序。该应用程序以横向正确启动。但是,我的主 ViewController 中的视图以纵向显示。也就是说,它被旋转了 90 度,以使图像看起来被裁剪并且不占据整个屏幕。如果我使用我的界面呈现一个模态视图控制器,然后返回到主 ViewController,问题就会自行纠正(视图以横向呈现)。这个问题在 Xcode 4.2 下没有出现。它发生在升级到 Xcode 4.3 之后,并且当我升级项目设置时,Xcode 自动实现了唯一的代码更改。

根据其他帖子中的建议,我验证了我的 Info.plist 设置中支持的界面方向和初始界面方向。我为每个视图控制器覆盖了 shouldAutorotateToInterfaceOrientation 方法,只为横向返回 YES。另外,我关闭了视图的自动调整大小,因为我不希望视图的大小/方向发生变化。

基于此链接 [1] 中的想法,我怀疑问题是视图在启动时没有收到更改方向的调用,可能是由于删除了似乎已替换的 MainWindow.xib 概念通过 AppDelegate.m 中的以下 Xcode 插入代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    return YES;

我修改了这个方法来生成一个通用的根视图控制器,从中显示我的 ViewController 类,如下面的代码所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    ViewController* myViewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.viewController = [[UIViewController alloc] init];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    [self.viewController presentModalViewController:myViewController animated:NO];
    return YES;

瞧!这解决了我的问题。然而,对我来说,这感觉像是一个根本层面的改变,我不想在我的发展的这个阶段做出这样的改变。我打算成为我的根视图控制器的东西现在是一个模态视图。有人对此问题有其他解决方案吗?

提前致谢!

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题:一个本来应该是横向的应用程序假设 ViewController 始终是纵向的。我对项目和 info.plist 的各个方面进行了大量更改,包括为主 UIWindow 提供一个横向的根视图控制器。它仍然没有工作。我最终撤消了所有更改,并将下面提到的两行添加到我的应用程序委托中:

- (void)applicationDidFinishLaunching:(UIApplication *)application 

    [_window addSubview:[_viewController view]];
    glView = _viewController.glView;

    // THIS FIXED ORIENTATION FOR ME IN ios 6
    _window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    // END

    ...my other setup code here...

没有其他必要了。

似乎出于某种原因,在 iOS 6 中 UIWindow root-view-controller 设置有时会在 Interface Builder 中被忽略。我确信我的推理在某处是错误的,但我认为这很可能有助于促使某人朝着更全面、更详尽的答案方向发展。

【讨论】:

【参考方案2】:

在 iOS 8 中,还需要将窗口框架设置为 UIScreen,因为它不会自动更新。

self.window.frame = [UIScreen mainScreen].bounds;

【讨论】:

以上是关于UIWindow 的根视图控制器在应用启动时不会旋转到横向的主要内容,如果未能解决你的问题,请参考以下文章

应用程序中多个 UIWindow 的最佳实践

应用程序启动结束时的根视图控制器,默认为 cocos2d 视图控制器而不是另一个故事板视图

如何在屏幕的某个部分添加另一个 UIWindow

iOS - 在segue上意外旋转回纵向

MonoTouch 和“应用程序在应用程序启动结束时应该有一个根视图控制器”错误

更改 iOS 窗口的根视图控制器