17

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

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

//  ViewController.m

-(BOOL)shouldAutorotate
{            
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

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

-编辑-

适用于 iOS 6.1

4

3 回答 3

31

当涉及 a 时,在andUINavigationController上创建一个类别。 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

于 2013-02-21T14:15:48.103 回答
4

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
    }
}
于 2017-02-28T21:18:23.740 回答
1

根据文档

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

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

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

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

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

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

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

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

你也可以在这里查看我之前的回答。

在嵌入容器视图控制器时了解 UIViewController 旋转。

于 2018-03-25T07:52:15.683 回答