Storyboard中的多个UIViewControllers具有不同的界面方向首选项

时间:2014-02-26 14:20:31

标签: ios uiviewcontroller

我已经阅读了有关同一问题的其他几个问题(和答案),但找不到针对我案例的单一工作解决方案。

我正在使用Storyboard为iOS7开发iOS应用程序。这个应用程序由多个UIViewControllers组成。除了一个必须只显示纵向界面方向,所有这些都必须显示。我的问题是所有的视图都不应该旋转。

在XCode项目设置中,我勾选PortraitLandscape Left设备方向。

以下网址提供了相关的Apple文档:Controlling What Interface Orientations Are Supported (iOS 6)supportedInterfaceOrientationspreferredInterfaceOrientationForPresentation

我添加到UIViewControllers中的所有Storyboad(但可以旋转的那个)以下方法:

- (BOOL) shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
   return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

不幸的是,所有视图都旋转到横向左侧位置。为什么呢?

3 个答案:

答案 0 :(得分:0)

从这里得到解决方案:iOS6: supportedInterfaceOrientations not working (is invoked but the interface still rotates)

在写我之前我没有找到那个问题。对不起。

问题出在Apple文档中。在一个地方他们写这个:

  

当在根视图控制器上显示视图控制器时,   系统行为有两种变化。首先,提出的观点   当使用controller而不是根视图控制器时   确定是否支持方向。

你认为决定是由占据屏幕的UIViewController决定的。

在UIViewController类引用中,他们写了这个:

  

通常,系统仅在根视图上调用此方法   窗口的控制器或视图控制器呈现填充   整个屏幕;子视图控制器使用窗口的一部分   由他们的父视图控制器提供给他们,不再   直接参与有关支持轮换的决策。   应用程序的方向掩码和视图的交集   控制器的方向掩码用于确定哪些方向   视图控制器可以旋转到。

您应该从中了解到使用UINavitationController时第一句不适用。

答案 1 :(得分:0)

您需要向方法- (BOOL) shouldAutorotate添加更多代码,例如纵向方向

- (BOOL)shouldAutorotate{

    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait) {

        return YES;
    }
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    NSLog(@"rotate");

}

您需要在App Delegate中添加此方法

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  // iOS 6 autorotation fix {
    return UIInterfaceOrientationMaskAll;
}

答案 2 :(得分:0)

确保在项目中启用纵向,横向右和横向左方向。然后,如果要阻止特定视图的某些方向:

– application:supportedInterfaceOrientationsForWindow:

如果要强制显示特定视图的方向,请检查问题How to handle different orientations in iOS 6.在那里查看答案,了解您需要的项目示例。

基本上,您需要在viewcontroller(要旋转的控件)中嵌入自定义导航控制器。在此自定义导航控制器中添加以下方法

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

并添加到应旋转的视图控制器:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}