iOS 6 - 某些视图的导航控制器横向旋转,而其他视图仅限

时间:2013-02-20 20:32:25

标签: ios rotation modal-dialog uiinterfaceorientation

我正在构建一个仅适用于主视图的应用程序(正常和颠倒)。 我在项目设置/ Plist中设置了此设置,一切正常。 但是,我有一些模态视图可以显示图像/视频,我希望它们可以旋转到所有方向。

我尝试为UINavigationController添加一个类别,但没有运气。 我还添加了viewController,调用模式下面的代码:

-(BOOL)shouldAutomaticallyForwardAppearanceMethods{
    return NO;
}
-(BOOL)shouldAutomaticallyForwardRotationMethods{
    return NO;
}

我已将以下代码添加到我希望允许所有方向的模态viewControllers中:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

我错过了什么?有什么建议吗?

2 个答案:

答案 0 :(得分:3)

在iOS 6上,旋转处理已更改。对于您描述的问题,有几种方法。首先,在plist中,启用除肖像上下颠倒的所有方向。

然后您可以使用以下解决方案之一:

  1. 使用仅允许旋转为纵向的UINavigationController的子类。
  2. 对于所有控制器,指定它们支持的旋转。
  3. 您可以覆盖应用程序委托中的方法。当方向更改或按下新视图控制器时,您的代理会调用该方法,您可以使用它暂时启用/禁用应用程序的横向显示:

    // In AppDelegate.h:
    @property (nonatomic) BOOL portraitOnly;
    
    // In AppDelegate.m:
    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        return _portraitOnly ? UIInterfaceOrientationMaskPortrait : UIInterfaceOrientationMaskAllButUpsideDown;
    }
    
    // to switch to portrait only:
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = YES;
    
    // to switch to allowing landscape orientations:
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = NO;
    

答案 1 :(得分:1)

您需要为构建设置中层次结构中的祖先的viewControllers启用旋转(以便允许层次结构中较低的VC能够根据需要进行旋转)。然后在每个viewController中从shouldAutoRotatesupportedInterfaceOrientationswillAnimateRotationToInterfaceOrientation返回正确的逻辑。

- 对于根本不移动的viewControllers,从shouldAutoRotate返回NO。

- 同样,从shouldAutoRotate返回YES并从supportedInterfaceOrientations

返回该VC中有效的方向

- 使用willAnimateRotationToInterfaceOrientation进行最后一分钟清理或在新方向出现之前需要进行的数据更改。

如果您仍有问题,请随时告诉我。希望它有所帮助!