iOS 9支持的接口定向不工作

iOS 9支持的接口定向不工作,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我有一个带有以下代码的UIViewController: - (BOOL) shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationPortrait; } 我没有使用UINavigationController。当显示此UIViewController时,设备仍将旋转至横向。我的目标是iOS 9,这里有什么问题?所以问

我有一个带有以下代码的
UIViewController

- (BOOL) shouldAutorotate {
     return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationPortrait;
}

我没有使用
UINavigationController
。当显示此
UIViewController
时,设备仍将旋转至横向。我的目标是iOS 9,这里有什么问题?

所以问题是我在
info.plist
中定义了允许的方向,这显然覆盖了整个项目中其他任何地方的操作


为了纠正这个问题,我从
info.plist
中删除了条目,并在项目设置中定义了它们。现在一切正常。

我尝试了许多解决方案,但正确的解决方案是:

ios 8和ios 9,无需编辑info.plist

- (BOOL) shouldAutorotate {
 return NO;
 }   



- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return (UIInterfaceOrientationPortrait |  UIInterfaceOrientationPortraitUpsideDown);
 }

UIInterfaceOrientationUnknown

无法确定设备的方向

UIInterfaceOrientationPortrait

设备处于纵向模式,设备保持直立,主页按钮位于底部

UIInterfaceOrientation上下方向图

设备处于纵向模式,但倒置,设备保持直立,主页按钮位于顶部

UIInterface方向和左视图

设备处于横向模式,设备保持直立,主页按钮位于左侧

UIInterfaceOrientationAndscapeRight


设备处于横向模式,设备保持直立,主页按钮位于右侧。

我认为Bryan的回答不起作用,因为改变项目设置中的方向也会改变@mrhangz评论的
info.plist

如果问题仅限于iOS9,则可能是由于iPad中的iOS9新功能名为
拆分视图
。iOS9默认情况下在特定iPad设备中启用
拆分视图
,请参阅苹果文档

split view
强制应用程序在采用后支持所有视图中的所有方向。因此,如果您在
info.plist
或目标常规设置中设置了所有方向支持,然后默认情况下支持
split view
,这将忽略方向设置,尽管在viewController中支持界面方向,并支持所有方向

如文档所述,如果您在目标设置中选中了
要求全屏
,则您的应用程序将不支持
分割视图
。现在您可以再次控制代码中的方向。
在swift 5中

下面的代码将当前视图控制器锁定为纵向模式,但仍允许其他视图控制器转换为横向模式。我相信您必须在项目级别启用所有方向,然后使用此方法“关闭”,但不确定是否有办法将它们逐个“打开”

private var _orientations = UIInterfaceOrientationMask.portrait
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    get { return self._orientations }
    set { self._orientations = .portrait }
}
关于这一切,可以在这里找到更全面的解释:

为简单起见,对于iPad,如果info.plist中受支持的界面方向(iPad)属性包括所有四个方向,且UIRequiresFullScreen属性值为否,iOS会将您的应用程序视为支持拆分视图。如果应用程序支持拆分视图功能,则不能禁用其旋转,至少可以通过上述方式禁用


我有一个详细的答案。

您是否尝试在xcode项目设置上执行相同的操作?尝试在xcode中禁用lanscape左、右模式,只检查纵向模式,看看是否有效!!!我有其他UIViewController,我想允许旋转。只是不是这个特别的。我还确保这个UIViewController在我的故事板中被设置为正确的类。有人知道如何在swift3中做到这一点吗?谢谢!你救了我一天。作为记录,我在ios 9.0上有过这个bug,但它似乎在ios 9.1Bryan上得到了修复。我从info.plist文件中删除了这些条目,但我不明白在项目中定义它们是什么意思?我仍然让我所有的风投改变方向。即使我在VC中添加了一些方法来防止它(支持界面定向、shouldAutoRotate等)。我试图一次解决允许横向模式块的问题,并且需要防止需要大量重构的VCs采用横向模式。请注意,从info.plist中删除方向支持将导致上载错误(ITMS 90474)有关iOS9,请参见:当您删除
info.plist
中的方向时,它也会更改项目设置。@TicoBallagas这是一个令人费解的问题,因为正如您的链接所示,以及上述答案所述,设置“需要全屏”将修复上载时的所有错误。它不需要的,也是每个人都需要的,是调用方法。我已经在几个视图控制器中实现了
shouldAutorotate
,但是没有一个被调用。XCode 8.2,iOS 10.2这对我很有用。我需要这个信息,我不知道。不适合我。我的视图控制器中有
-(BOOL)shouldAutorotate
,但它从未被调用,我已选中“需要全屏”。据我所知,我一直在检查。使用Xcode 9并在iPhoneX上进行测试,我发现了同样的问题。覆盖似乎没有效果,关于plist mods和要求全屏显示的建议也不会影响我测试的结果。唯一影响结果的似乎是在应用程序范围内的设置中锁定旋转。想知道是否有人发现了获得这项工作的“秘密”,或者这仍然是个谜。您需要将UIInterfaceOrientationTask而不是UIInterfaceOrientation返回到支持的InterfaceOrientation(例如UIInterfaceOrientationMaskPortrait)