0

我使用此代码强制我的主屏幕(我的应用程序的第一个屏幕)是纵向的,而其他屏幕仍然支持所有方向:

    public class RltNavigationController : UINavigationController
{
    public RltNavigationController () : base ()
    {
    }

    public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations ()
    {
        if(this.TopViewController is HomeScreen )
            return UIInterfaceOrientationMask.Portrait ;
        else 
            return UIInterfaceOrientationMask.AllButUpsideDown  ;

    }

    public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
    {
        // Return true for supported orientations
        if(this.TopViewController is HomeScreen )
            return (toInterfaceOrientation == UIInterfaceOrientation.Portrait );
        else 
            return (toInterfaceOrientation != UIInterfaceOrientation.PortraitUpsideDown) ;

    }


}

现在,假设设备在主屏幕上处于横向(设备是横向但屏幕只显示纵向)。现在,如果用户转到其他视图,其他视图现在显示纵向,而应该显示横向。我可以选择什么解决方案来加载带有实际旋转的第二个视图?

编辑

感谢所有答案,请注意,问题不是我不能强制屏幕为纵向。为了理解问题,请遵循以下场景:

-> 第一个屏幕强制为纵向。

-> 设备是横向的,我在主屏幕(所以主屏幕显示纵向)

-> 现在我切换到另一个支持所有方向的屏幕

-> 在另一个屏幕上,因为父屏幕是纵向的,所以它显示纵向(因为设备是横向的,它应该显示横向)

4

3 回答 3

0

您不能明确地说,viewController 是横向的,而视图将是横向的。它的工作方式是,您询问作为屏幕控制器的控制器,这可能是导航控制器、选项卡视图控制器、模式,它们希望如何能够旋转。如果你有一个导航控制器,那么所有的 viewController 将只有你的导航控制器的旋转。

有一些技巧,比如子类化导航控制器和通过 should auto rotate 方法,调用 [self.visibleViewController shouldAutoRotate]; 这适用于使屏幕旋转而不是旋转,但是如果您只有 1 个屏幕支持所有方向而所有其他屏幕不支持,那么您会遇到推送/弹出错误,如果您在该不同方向上推送或弹出下一个 viewController将在那个方向。

由于您不能直接告诉 rootViewController 显式旋转,因此下一个最佳解决方案是,

  • A:使用 QuartzCore 自己手动旋转视图
  • B:每个方向都有一个单独的 xib 文件,因此当您旋转到横向时,您会看到横向视图控制器,反之亦然
于 2013-10-26T19:40:55.530 回答
0

最简单的方法是创建一个自定义导航控制器(UINavigationController 的子类),它基于当前可见的视图控制器继承其旋转

在您的自定义导航控制器内部:

-(NSUInteger) supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

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

然后在其中的任何视图控制器中,添加这些方法:

-(BOOL)shouldAutorotate{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}

那是您不想自动旋转的视图。为您想要旋转的视图相应地修改它。

确保您的项目设置具有您想要启用的方向的旋转,并确保使用您的自定义导航控制器而不是常规导航控制器来处理包含多个可能旋转的任何视图层次结构。

请注意,如果弹出一个旋转的视图并且前一个视图不可旋转,您可能会遇到问题。在我的脑海中,我不确定这是否会正常工作。

于 2013-10-26T19:52:48.153 回答
0

您还可以直接从 XIB 中选择特定的 viewController 是 Landscape 或 Portrait 并且加载相同。

于 2013-10-26T16:56:03.167 回答