迫使UITabBarController中的ViewController成为iOS 7中的格局

时间:2014-04-12 07:09:40

标签: ios ios7 rotation landscape uiinterfaceorientation

好的,我真的非常绝望,尝试各种可能性,但总是在同一个(令人沮丧的)地方结束。

我的设置很简单,我有一个iPad应用程序,它使用我用故事板设置的UITabBarController。

第一个项目可以根据需要旋转,我不在乎,我在Autolayout中配置它,所以旋转设备时一切都很好。

我真正的问题在于第二项,我需要从一开始就只在风景中显示(!)。我阅读了Stackoverflow的所有文档和类似问题,但我仍未能实现这一目标。

根据我目前的理解,我的最新尝试应该如下:

我了解到问题的解决方案将以某种方式涉及UIViewController -(NSUInteger)supportedInterfaceOrientations- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation- (BOOL)shouldAutorotate这三种方法。但是,当我在UITabBarController中呈现我的视图控制器时,这些甚至不会在实际的视图控制器上调用,而是在其父控件UITabBarController上调用。因此,我将UITabBarController子类化并添加以下代码,让我的视图控制器能够自行决定它们不会如何旋转:

-(NSUInteger)supportedInterfaceOrientations
{
    return [self.selectedViewController supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}

- (BOOL)shouldAutorotate
{
    return [self.selectedViewController shouldAutorotate];
}

在调试器中,我可以看到这实际上有效,并且最终会在我的实际视图控制器上调用这些方法。

现在,我需要在我的第二个视图控制器中实现这些,我想只在横向显示,以便它可以自己控制其旋转行为。我想我现在已经在这三种方法中尝试了几乎所有可能的返回值组合。我得到的最接近的实际上是视图控制器在最初打开横向时会保持其方向。

我最大的问题是当视图以纵向打开时,我不知道如何强制视图控制器将其方向设置为横向,即使设备是纵向的。我真的开始怀疑是否真的有一个干净的方法来做到这一点!根据我的理解,这种干净的方式应该使用- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation,因为它的文档说明:

  

如果视图控制器支持多个方向但在不同方向上看起来更好,则可以通过覆盖preferredInterfaceOrientationForPresentation方法来提供首选方向。

这似乎就像我的问题的确切解决方案,所以根据我的理解,这段代码应该有效:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeRight;
}

- (BOOL)shouldAutorotate
{
    return NO;
}

但事实并非如此!原因在于,与最初呈现时相比,- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation甚至都没有被调用(既不在父UITabBarController上也不在使用上述返回值的实际视图控制器上)。

有人可以解释一下我在想错的地方吗?我在这里缺少什么?

顺便说一下,我也尝试过将[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];放入viewDidLoadviewWillAppear:的黑客攻击,但这两种方法都没有效果......我对此感到非常沮丧!

1 个答案:

答案 0 :(得分:0)

如果你的UITabBarController是RootViewController,那么定向管理应该在你的UITabBarController而不是它的孩子中完成。

您应始终管理父级而非子级的方向更改。

UITabBarController应该自动转到用户界面,检查当前显示的视图控制器并相应地返回YES / NO