防止一个视图控制器自动旋转?

Posted

技术标签:

【中文标题】防止一个视图控制器自动旋转?【英文标题】:Prevent autorotate for one view controller? 【发布时间】:2013-02-21 14:07:34 【问题描述】:

我的应用可以自动旋转,但我需要其中一个视图仅以纵向模式显示,并且不知道如何实现。

我尝试了这个(除其他外),但有问题的视图仍然旋转:

//  ViewController.m

-(BOOL)shouldAutorotate
            
    return NO;


- (NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskPortrait;

有人可以指出我做错了什么吗?谢谢。

-编辑-

适用于 ios 6.1

【问题讨论】:

您开发的 SDK 版本是什么? ***.com/questions/12630359/… iOS 6,对不起。我已经更新了 OP。 CustomNavigationController 很可能会解决您的问题。见***.com/questions/12630359/… 导航控制器中的视图控制器?我以前见过:***.com/questions/14658268/… 【参考方案1】:

当涉及UINavigationController 时,在UINavigationControlleroverride supportedInterfaceOrientations 上创建一个类别。

#import "UINavigationController+Orientation.h"

@implementation UINavigationController (Orientation)

- (NSUInteger)supportedInterfaceOrientations 
   return [self.topViewController supportedInterfaceOrientations];


- (BOOL)shouldAutorotate 
    return YES;


@end  

现在,iOS 容器(例如 UINavigationController)不会咨询它们的子容器来确定它们是否应该自动旋转。

如何创建类别 1.添加一个新文件(cocoa touch下Objective c-category) 2. Category : UINavigationController 上的方向 3、将以上代码添加到UINavigationController+Orientation.m

【讨论】:

是的,有一个 UINavigationController 参与其中,但我不得不承认我不知道您所说的子类化究竟是什么意思,但我会去读一读。 @Robert 只需在UINavigationController 上添加一个类别即可查看我的编辑 这也适用于父级 UITabBarController 为什么不继承和覆盖? Apple 说:避免 Category Method Name ***es ..如果在一个类别中声明的方法的名称与原始类中的方法相同,或者同一类(甚至超类)上的另一个类别中的方法,则行为未定义在运行时使用哪种方法实现。如果您在自己的类中使用类别,这不太可能成为问题,但在使用类别向标准 Cocoa 或 Cocoa Touch 类添加方法时可能会导致问题。【参考方案2】:

Swift 3 版本接受的答案:

extension UINavigationController 

    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask 
        // Change `.portrait` to whatever your default is throughout your app
        return topViewController?.supportedInterfaceOrientations ?? .portrait
    

    open override var shouldAutorotate: Bool 
        return true
    

【讨论】:

【参考方案3】:

根据documentation。

视图控制器可以覆盖supportedInterfaceOrientations 方法来限制支持的方向列表。

所以我们需要覆盖shouldAutorotatesupportedInterfaceOrientation 来定位view controllers

通常,系统仅在窗口的根视图控制器或呈现为填满整个屏幕的视图控制器上调用此方法。

如果您有非常简单的配置,例如您的目标 view controllerwindowrootViewController 或被呈现为覆盖整个屏幕,这将起作用。

如果目标视图控制器的配置很复杂,比如嵌入在其他一些容器视图控制器中。

子视图控制器使用其父视图控制器为它们提供的窗口部分,不再直接参与有关支持哪些旋转的决策。

因此,这些容器视图控制器的默认实现可能不会向那里的孩子询问 supportedInterfaceOrientation 偏好。

所以为了让我们的目标child view controller 指定supportedIntefaceOrientation,我们需要告诉容器视图控制器这样做。

你也可以查看我之前的回答here。

和Understanding UIViewController rotation when embed in Container View Controllers.

【讨论】:

以上是关于防止一个视图控制器自动旋转?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何防止视图旋转到横向视图?

某些视图控制器独有的自动旋转

在视图控制器之间切换时自动旋转

限制某些视图的自动旋转

视图控制器和自动布局旋转问题

将视图添加到视图控制器并使用自动布局通过旋转完全覆盖它的正确方法是啥?