正确的方法将shouldAutorotate传播到iOS6中的深度模态视图控制器中

时间:2012-10-12 09:43:57

标签: iphone objective-c ios xcode ipad

在iOS6中将shouldAutorotate传播到深modal viewcontroller的正确方法是什么

考虑以下示例:

  1. 在XCode 4.5中创建新样本Tabbed Application
  2. Summary中,选择所有方向
  3. 创建一个新的简单UITabBarController,例如MyTabBarViewController并添加代码

    - (BOOL)shouldAutorotate {
        return YES;
    }
    
    - (NSUInteger)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskAll;
    }
    
  4. 在AppDelegate中,将UITabBarController替换为MyTabBarViewController以挂钩轮播

    self.tabBarController = [[MyTabBarViewController alloc] init];
    
  5. 现在旋转应该有效,并在FirstViewController中添加代码,以便在点击时显示模态 viewcontroller

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UIViewController * viewController2 = [[SecondViewController alloc] 
            initWithNibName:@"SecondViewController_iPhone" bundle:nil];
    
        [self presentViewController: [[UINavigationController alloc] 
            initWithRootViewController:viewController2] 
            animated:YES 
            completion:nil];
    }
    
  6. 问题:

    现在由于SecondViewControllerUINavigationController包裹,即使我在SecondViewController中添加了shouldAutorotate,也无法正确完成颠倒旋转。

    唯一的解决方法是创建自定义UINavigationController并实施shouldAutorotate,这应该可行。

    但这种方法听起来很愚蠢,它需要我通过实现shouldAutorotate修复所有UI类,我不能再使用[UINavigationController alloc] initWithRootViewController...这样的缩写,我必须实现所有这些UITabBarControllerUINavigationController

    有没有更好的方法?

2 个答案:

答案 0 :(得分:0)

这不是愚蠢的,而且似乎是正确的方式。 您可以创建UINavigationController的子类,并使用 [[MyNavigationController alloc] initWithRootViewController:...]

答案 1 :(得分:0)

你试过这个:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];

这是设备发送的通知,告知观察者旋转。当你不再需要时,别忘了删除Observer