iOS 6在父视图控制器和子视图控制器中使用不同的自动旋转

iOS 6在父视图控制器和子视图控制器中使用不同的自动旋转,ios,objective-c,rotation,Ios,Objective C,Rotation,我有点困在这里 我使用NavigationController显示不同的ViewController,每个ViewController都有自己的自动旋转设置。正如这里关于堆栈溢出的其他人所建议的那样,我将UINavigationController子类化并实现了 -(BOOL)shouldAutorotate { UIViewController *top = [self topViewController]; return [top shouldAutorotate]; }

我有点困在这里

我使用NavigationController显示不同的ViewController,每个ViewController都有自己的自动旋转设置。正如这里关于堆栈溢出的其他人所建议的那样,我将UINavigationController子类化并实现了

-(BOOL)shouldAutorotate
{
    UIViewController *top = [self topViewController];
    return [top shouldAutorotate];  
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;   
}
然后在我的ViewController中设置所需的行为。到目前为止,这一切都很好

但是,在一个场景中,我希望内容不应与旋转元素一起旋转。其想法是以全屏(隐藏状态栏)显示设备摄像头的图像,并在顶部渲染一些3D内容(使用Vuforia框架),这些内容仅以纵向显示。为了允许调整,我还想使用工具栏显示不同的调整视图。我打算在3D视图的顶部使用它,并且能够根据设备的方向旋转

为了实现这一点,我尝试使用两个ViewController。一个用于工具栏和调整视图,作为三维视图的ViewController中的子ViewController嵌入。 为此,我采用了下面取自苹果的代码示例

不幸的是,使用这种方法,工具栏不会旋转。仅在父视图控制器中调用shouldAutorotate,这似乎合乎逻辑,因为子视图控制器将不是topViewController。但在这两个控制器中,都需要调用supportedInterfaceOrientations。 我还尝试将两个控制器作为子控制器嵌入到第三个控制器中,结果相同

另一个想法是手动旋转工具栏,但是因为父级返回NO for shouldAutorotate,所以我没有找到一种简单的方法来检测旋转,因为旋转处理方法不会被调用

我之前做的和实际工作的,是允许旋转和手动旋转三维视图。但效果不是很吸引人

我该怎么做才能同时拥有旋转内容和固定内容


非常感谢您的帮助。

我建议您创建新的
UIWindow
,并将您的全屏ViewController添加到它的
rootViewController
。您可以根据需要为自己的
UIWindow
(以及它的ViewControllers)自定义旋转行为。太好了-我不知道可以使用多个窗口。UIWindow参考说明有三种可能的WindowLevel,UIWindowLevelNormal、UIWindowLevelStatusBar和UIWindowLevelAlert,各自的值为0.0,1000.0和2000.0为了获得正确的顺序,我为包含工具栏的窗口设置了单独的windowLevel,使其位于3D视图的顶部,但低于状态栏和警报级别。这是可行的,但这是正确的方法吗?
- (void) displayContentController: (UIViewController*) content;
{
    [self addChildViewController:content];                 
    content.view.frame = [[UIScreen mainScreen] bounds]; 
    [self.view addSubview:self.currentClientView];
    [content didMoveToParentViewController:self];          
}