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

时间:2012-04-10 21:22:33

标签: orientation landscape uiwindow

我正在开发一个基于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;
}

瞧!这解决了我的问题。然而,对我而言,这感觉就像是一个基本层面的变化,我不想在我的发展中做出这一点。我打算成为我的根视图控制器现在是一个模态视图。有没有人有这个问题的另一种解决方案?

提前致谢!

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题:一个应用程序本来是在Landscape中,假设ViewController总是在Portrait中。我对项目和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中,似乎在Interface Builder中忽略了UIWindow根视图控制器设置。我确信我的推理在某个地方是错误的,但我认为这可能会帮助某人朝着更全面,更详尽的答案的方向前进。

答案 1 :(得分:0)

在iOS 8中,设置Windows框架到UIScreen也是必要的,因为它不会自动更新。

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