如何在 iOS 7/8 的单个视图上禁用横向

Posted

技术标签:

【中文标题】如何在 iOS 7/8 的单个视图上禁用横向【英文标题】:How to disable landscape orientation on a single view at iOS 7/8 【发布时间】:2015-03-14 18:16:43 【问题描述】:

我在一般目标设置下为我的应用启用了横向:

一切正常 - 该应用程序可用于所有选定方向...

现在我想禁用只有一个视图上的横向模式。

我在特定的视图控制器上尝试了以下操作:

- (BOOL)shouldAutorotate

    return NO;



- (NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskPortrait;

可惜没有成功……


编辑:

我的应用的结构是:

UITabBarController
    UINavigationController
        UITableViewController
            UIViewController

【问题讨论】:

这个视图是否嵌入在导航控制器中? @JoshGafni 是的,它是一个子视图... 【参考方案1】:

上面的代码是放在视图的ViewController还是NavigationController?你需要把它放在导航控制器中,否则导航控制器会旋转,导致视图也旋转。子类 UINavigationController 并覆盖 shouldAutoRotate:

- (BOOL)shouldAutorotate

    id currentViewController = self.topViewController;

    if ([currentViewController isKindOfClass:[ViewController class]])
        return NO;

    return YES;

因此,只有当显示的视图是您不想旋转的视图时,导航控制器才会旋转。

编辑

UITabBarController 内部:

- (BOOL)shouldAutorotate


    if([self.selectedViewController isKindOfClass:[UINavigationController class]])

        UINavigationController *navigationController = (UINavigationController *) self.selectedViewController;
        id currentViewController = navigationController.topViewController;

        if ([currentViewController isKindOfClass:[ViewController class]])
            return NO;
        
    
    return YES;

【讨论】:

感谢您的快速回复!将您的代码添加到 NavigationController - 但什么也没发生...我将我的应用程序结构添加到问题中 - 也许有问题? 我在 shouldAutorotate 函数中添加了一个断点,如果我打开 tableview(在选项卡中),它不会被调用... 其实坚持一下。你到底想发生什么。您是否希望选项卡旋转,但其中的视图不旋转?你想让导航栏也旋转吗? 我有不同的选项卡,里面是一些表格视图,表格视图下方是普通视图控制器......“普通”应用程序应该旋转,但表格视图下方的一些“子视图”应该不是…… 但我想当您查看“普通视图控制器”时,选项卡和导航栏仍然在屏幕上可见。如果“普通视图控制器”在屏幕上,您是否希望它们也不要旋转?

以上是关于如何在 iOS 7/8 的单个视图上禁用横向的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何在情节提要中在横向和纵向视图之间切换?

如何在 iOS 中禁用单个 HTML 元素的触摸操作

如何禁用单个视图的客户端验证?

iOS8:当手机旋转到横向时如何显示不同的视图控制器?

如何启用或禁用特定 ViewController 的横向模式?

如何在 iOS 横向中隐藏 TextView