导航控制器应用程序中 2 个 UIViewcontroller 的方向问题

Posted

技术标签:

【中文标题】导航控制器应用程序中 2 个 UIViewcontroller 的方向问题【英文标题】:Issue with orientations of 2 UIViewcontrollers in navigation controller application 【发布时间】:2012-05-25 14:19:44 【问题描述】:

我有一个标签栏应用程序。第一个选项卡的项目是导航控制器。 导航控制器的堆栈中有 4 个项目。 我想提供轮换。但在 tabbar 应用程序中,这是问题所在,这就是我创建自己的 tabbarcontroller 并覆盖该方法的原因:

@interface RotatingTabBarController : UITabBarController

@end

@implementation RotatingTabBarController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

    if([self.selectedViewController isKindOfClass:[UINavigationController class]])
        BOOL f = [[(UINavigationController*)self.selectedViewController visibleViewController] shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
        return f;
     else 
        BOOL f = [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
        return f;
    


@end

之后,如果我提供适当的 UIInterfaceOrientation 支持,我的控制器将支持自动旋转。但是没有我的自定义 RotatingTabBarController 这似乎是不可能的

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

问题是: 当我在此视图控制器的 shouldAutorotateToInterfaceOrientation 中将 FirstViewController 推入导航控制器时,我只提供纵向方向, 但是当我按下 SecondViewController(我提供纵向和横向方向)时,如果 SecondViewController 的当前界面方向是横向并且我按下返回按钮(从堆栈中弹出 SecondViewController 并且出现 FirstViewController),则 FirstViewController 的方向是横向的。但在 shouldAutorotateToInterfaceOrientation 方法中,我只为他提供纵向。

【问题讨论】:

【参考方案1】:

实际上你不应该继承一个 UITabbarController 类。

UITabBarController 类实现了一个专门的视图控制器,用于管理无线电样式的选择界面。此类不用于子类化。

来自UITabBarController Class Reference

如果你查看控制器覆盖

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

方法,应该没问题。

我认为支持某些视图横向和某些不在应用程序中的视图不是一个好主意。

你已经找到原因了,如果用户在横屏模式下按下返回键怎么办?

这里应该做什么,在设备横向时旋转到纵向?

如果您想这样做,没有简单的方法可以强制设备更改方向。您必须使用转换来处理自己的视图方向。

您可以使用模型视图控制器支持视图的不同方向,该控制器不在导航控制器的堆栈上。

【讨论】:

1) 第一个视图控制器仅支持纵向。为什么我从 SecondViewController 按下后它会以横向显示? 2) 第一个视图控制器是表格视图,第二个视图控制器是图片库,这就是为什么我需要 SecondView 控制器支持两个方向,而 FirstViewController 只支持纵向。 3)关于“这里应该做什么,在设备横向时旋转到纵向”,我希望FirstViewController在设备横向时以纵向显示。 1) shouldAutorotateToInterfaceOrientation 方法仅在设备方向更改后调用,而不是在更改选项卡时调用。因此,您选择第二个选项卡,然后 ios 调用该方法并获得“是”,因此它会旋转。当您更改第一个选项卡时,它只使用最后一个方向。而且你不能强迫它旋转,除非你使用转换并处理所有旋转事件。 2)如果您出于某种原因使用,只有一个控制器支持横向,那么您可以将其呈现为模型视图控制器,而不是标签栏控制器的控制器。 3) 所以你想在切换标签时强制旋转。就像已经说过的那样,没有简单的方法可以做到这一点。如果你真的想这样做,你需要自己旋转视图。注意:我会在做之前考虑一下。作为用户,当我启动您的应用程序并在第一个选项卡上时,它只支持纵向,那么我为什么要尝试其他选项卡?所以你会有很多用户不知道你对第二个选项卡的横向支持,除非你放一些关于它的文本或图像。即使你这样做,我认为我在使用你的应用程序时必须多次旋转手机也不是那么好 谢谢,很好的答案。但我不想在切换标签时强制旋转。当我使用导航控制器并按下后退按钮时,我想这样做。但我理解基本思想。我有最后一个问题:我用 self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90)); 旋转了视图但是如何旋转navigationController和状态栏而不引起任何问题? 您需要旋转导航控制器的视图而不是控制器的视图。对于状态栏 [[UIApplication sharedApplication] setStatusBarOrientation: animated:] 方法应该有帮助【参考方案2】:

我使用了模态窗口并在横向模式下隐藏后退按钮。它解决了这个问题。

【讨论】:

这正是我推荐的。您可以使用模式视图控制器支持视图的不同方向,该控制器不在导航控制器的堆栈中。

以上是关于导航控制器应用程序中 2 个 UIViewcontroller 的方向问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何在 2 个视图控制器之间导航时删除黑色导航栏

1个单一导航控制器内的不同导航栏颜色?

百度地图导航算路成功但是无法进入导航页面

将标签栏添加到导航控制器

导航控制器注销

在不使用导航控制器的情况下转到第二个视图时如何显示动画?