0

我正在使用 iOS 6.1 和 7.0。他们两个的行为是相同的。根视图控制器是UIVeiwController. 它有一个属性UINavigationViewController来管理我的应用程序中所有显示的控制器。我有子类化UINavigationController、重载shouldAutorotatesupportedInterface旋转方法来获得推入其中的每个控制器的正确方向。

我想要的:推入导航 3 个控制器,第二个控制器应该只处于纵向。

我得到了什么:当我推动第二个控制器时它仍然处于横向模式,尽管它的supportedInterfaceOrientation方法返回纵向模式,然后推动第三个控制器并将模拟器或设备置于横向模式并弹出到我的第二个控制器,最有趣的是它消失了从画面...

我猜苹果文档说只有大多数顶视图控制器会收到有关旋转的通知,所以当我将导航控制器设为根时,当我从第三个控制器弹出到第二个控制器时它可以正常工作,但从第一个控制器推到第二个时仍然无法正常工作。当导航控制器只是根视图控制器的一个属性时,我需要用我的结构来解决这个问题。

这是项目的链接https://github.com/Trubianov/Navigation.git

4

2 回答 2

0

问题是新的工作流程使旋转方法仅在控制器出现时检查一次,这就是它不起作用的原因。

UINavigationController(或任何其他UIViewController容器)内推东西时,您可以决定孩子UIViewController支持的方向,操作系统会让它为您工作。

我的建议:除非您的子类中必须有一些自定义代码,否则您UINavigationController应该完全删除它并将旋转检查移动到您正在呈现的子视图控制器

于 2013-11-11T18:52:54.663 回答
0

这是解决方案。如果您将 UIViewController 放到 window.root 中,并且您的导航控制器只是根控制器的一个属性,那么您的导航将不会从 UIApplication 获得适当的回调,因此您必须将导航作为子视图控制器添加到您的根控制器。

我的代码片段:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    MyNavigationController *navController = [[MyNavigationController alloc] initWithRootViewController:[ViewController1 new]];
    MainViewController *main = [MainViewController new];
    main.myNavigationController = navController;
    [main addChildViewController:navController];
    self.window.rootViewController = main;
    [self.window makeKeyAndVisible];
    return YES;
}

还需要覆盖 MainViewController 中的以下方法。

 - (BOOL)shouldAutorotate 
{
   return [self.myNavigationController.topViewController shouldAutorotate]; 
}

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
   return [self.myNavigationController.topViewController            preferredInterfaceOrientationForPresentation]; 
}
于 2013-11-18T22:50:28.800 回答