iOS 6 UIInterfacePortrait ONLY viewcontroller正在呈现&陷入风景......当从导航堆栈中的横向视图控制器返回时

时间:2012-10-22 19:22:29

标签: objective-c xcode ios6 uiinterfaceorientation autorotate

与许多其他人一样,我遇到的问题是只有一个或两个视图控制器支持纵向和横向界面方向,在另一个仅限肖像的应用程序中。在iOS 6之前一切正常,但突然自动停止工作。感谢这里的一些很好的问题,我能够通过让初始的navController通过以下方式返回个人topViewController对shouldAutorotate的首选项来解决这个问题:

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

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

然而,我偶然发现了一个新问题。根vc(viewController A)不应该自动旋转,只应支持肖像。导航堆栈中的ViewController B支持纵向和横向。如果我在viewController B中,并且处于横向状态,并触摸“返回”以将视图弹回到viewController A ... vc A加载在横向中,它不应该支持,并且不会旋转回肖像,因为shouldAutorotate for vc A设置为NO ...

非常感谢任何关于如何处理这个问题的想法。我最初的想法是使用手动方法覆盖vc B的“后退”按钮,如果视图处于横向状态,则首先强制旋转回纵向...然后将视图控制器弹回到vc A ...但我无法弄清楚如何以编程方式强制旋转。有任何想法吗?

这是vc A中的接口方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return NO;
}

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

以下是vc B中的内容:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

2 个答案:

答案 0 :(得分:1)

在vcA中设置

-(BOOL)shouldAutorotate
{
  return YES;
}

但请保持

-(NSUInteger)supportedInterfaceOrientations
{
  return UIInterfaceOrientationPortrait;
}

然后当您从vcB

返回时,视图将旋转回(仅)支持的方向

答案 1 :(得分:0)

问题是所有容器视图控制器(选项卡栏控制器,导航控制器等)都支持您在plist文件中提供的所有接口方向。当系统要求支持的界面方向时,根视图控制器的设置和方法实现会覆盖它的子级。

在这种情况下,导航控制器同时支持横向和纵向,当B视图控制器弹出时,虽然系统要求A接口方向,但它也会询问它的根视图控制器,这将是成为"赢家"由于导航控制器支持横向,因此尽管A仅支持纵向,但它仍保留在横向中。

一个解决方案是,您将根视图控制器子类化并根据需要动态更改它的旋转方法。当只需要portait时,你的root实现应该只返回portait,当两个方向都可用时,你的root应该返回两者。