supportedInterfaceOrientations不起作用

我想要一些我的ViewControllers风景和一些肖像,所以这就是我所做的:

我启用了横向模式:

在这里输入图像说明

接下来,我将这些代码行添加到视图控制器,我想成为肖像:

-(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationPortrait; } -(BOOL)shouldAutorotate { return NO; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } 

但是当我旋转他们,他们仍然去风景模式。我可以解决这个问题?

这是我怎么做的。
创build一个UINavigationController父类。
在你内部UINavigationController(父)覆盖这些方法,如:

 - (NSUInteger)supportedInterfaceOrientations { if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientationsForThisContorller)]) { return(NSInteger)[self.topViewController performSelector:@selector(supportedInterfaceOrientationsForThisContorller) withObject:nil]; } return UIInterfaceOrientationPortrait; } - (BOOL)shouldAutorotate { if([self.visibleViewController respondsToSelector:@selector(shouldAutorotateNow)]) { BOOL autoRotate = (BOOL)[self.visibleViewController performSelector:@selector(shouldAutorotateNow) withObject:nil]; return autoRotate; } return NO; } 

现在你的NavigationController应该是UINavigationContorller父类的子类

Swift 3:

在你的UINavigationController子类中执行此操作

 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { get { return self.topViewController?.supportedInterfaceOrientations ?? .all } } override var shouldAutorotate: Bool { return self.topViewController?.shouldAutorotate ?? false } 

更新从马特的答案采取,如果你不想子类:

首先:让viewController成为viewDidLoad中的navigationController的一个委托

 self.navigationController?.delegate = self 

然后声明UIViewController扩展来响应委托方法,如下所示:

 extension UIViewController: UINavigationControllerDelegate { public func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask { return navigationController.topViewController?.supportedInterfaceOrientations } } 

Apple为UINavigationControllerdevise的方法是通过UINavigationControllerDelegate

通常我只是更新这个委托做下面的事情,并委派给导航控制器的堆栈顶部显示控制器:

 #pragma mark - UINavigationControllerDelegate - (NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController { return [navigationController.topViewController supportedInterfaceOrientations]; } 

在我看来, UINavigationController应该只是默认的上述行为,但这是Apple提供的api 🙂

至于信息plist文件,我没有选中所有的选项,并在代码中处理所有的选项,因为它在过去引起了我的问题,我厌倦了处理它。

只为你所有的信息,创build一个新的基于单个视图的应用程序,在viewController中实现应该自动旋转的委托和supportedInterface方向在其中添加断点。

运行(通用模式)

  1. 在iPhone模拟器上:执行停止在断点处
  2. 在iPad模拟器:执行不会停止(委托方法永远不会被调用!!!!)
  3. 在iPad设备上:好的

所以,不要像我所说的那样浪费时间, XCode 7.3是BUGGED

你可以在下面的post中看到答案:

iOS 6旋转:supportedInterfaceOrientations不工作?

让我知道如果这是你的问题。