UINavigationController堆栈中支持的不同接口方向

时间:2013-08-07 01:06:56

标签: ios uiviewcontroller

我有一个UINavigationController作为我的UIWindow的rootViewController,UIViewControllerControllerA)仅支持纵向方向,已添加到UINavigationController rootViewController

稍后,我将UINavigationController's rootViewController替换为新的UIViewController(ControllerB)。 ControllerB支持纵向和横向。我希望我的初始屏幕(ControllerA)仅适用于Portrait,而应用程序的其余部分可以支持纵向和横向。

[self.navigationController setViewControllers:@[viewControllerB] animated:NO];

| UINavigationController launches:
| ----ControllerA (rootViewController): Portrait only
| ----ControllerB (rootViewController): Portrait and Landscape supported

如果我在Landscape中启动我的应用程序,而这个应用程序未由ControllerA处理,然后移至ControllerB,则我的内容(+状态栏)仍在纵向中。如果我此时手动旋转设备,我有正确的内容布局。

如何让ControllerB在设备的方向上自我渲染?

以下是我从ControllerA和ControllerB viewWillAppear方法中看到的内容:

navigationController orientation: UIInterfaceOrientationPortrait 
UIViewController interfaceOrientation: UIInterfaceOrientationPortrait 

<!-----------!!two values are different!!------------------>
[[UIDevice currentDevice] orientation]: UIDeviceOrientationLandscapeLeft 
[[UIApplication sharedApplication] statusBarOrientation]: UIInterfaceOrientationPortrait 
Phone is physically held in Landscape at this point in time.

1 个答案:

答案 0 :(得分:0)

这是最简单的解决方案(仅限iOS7),但可以扩展到iOS5。

只需编写我们自己的UINavigationController(或编写一个类别)并实现supportedInterfaceOrientations。

@implementation MyNavigationController

- (NSUInteger)supportedInterfaceOrientations
{
    return self.topViewController.supportedInterfaceOrientations;
}

@end

当您想知道界面方向时,请始终使用UIViewController.interfaceOrientation。状态栏方向可能是错误的(如果是多个窗口),并且设备方向完全错误,因为设备可能正面朝上(平放在桌子上),并且您无法从中推断出界面方向。