iOS 9支持的界面方向不起作用

23

我有一个包含以下代码的 UIViewController

- (BOOL) shouldAutorotate {
     return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationPortrait;
}

我没有使用UINavigationController。当这个UIViewController被显示时,设备仍然会旋转到横向模式。我针对的是iOS 9,问题出在哪里?


你尝试在Xcode项目设置中做同样的事情了吗? - Teja Nandamuri
尝试在Xcode中禁用横向左右模式,仅勾选纵向模式,看看是否有效! - Teja Nandamuri
2
我有其他的UIViewControllers希望允许旋转,只是不包括这个特定的。我也确保在我的Storyboard中将此UIViewController设置为正确的类。 - Bryan
有人知道如何在Swift3中实现这个吗? - John
5个回答

36

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

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


谢谢!你救了我的一天。记录一下,我在iOS 9.0上遇到了这个bug,但在iOS 9.1上似乎已经修复了。 - Ben G
3
Bryan,我已经从info.plist文件中删除了这些条目,但我不明白您所说的在项目中定义它们的含义是什么?即使我向VC添加了方法以防止其旋转(supportedInterfaceOrientations、shouldAutoRotate等),我仍然发现所有的VC都在更改方向。我正在尝试解决一次性允许横向模式的问题,并需要防止需要进行大量重构的VC进入横向模式。 - stulevine
完全拯救了我的一天,谢谢!在 Info.plist 中删除支持的界面方向,然后只实现 shouldAutorotate 和 supportedInterfaceOrientations 就为我解决了这个问题。 - user2393462435
6
注意,从info.plist中删除方向支持将导致在上传时出现错误(ITMS 90474)适用于iOS9,请参见:https://dev59.com/gVwY5IYBdhLWcg3wWWm0 - Tico Ballagas
5
当您从 info.plist 中删除方向时,它也会改变项目设置。 - mrhangz
1
@TicoBallagas 这是一个误导,因为正如你的链接所示,并且上面的答案已经说明,设置“需要全屏”将修复上传时的任何错误。它无法做到的是,每个人都需要的方法被调用。我在几个视图控制器中实现了shouldAutorotate,但没有一个被调用。XCode 8.2,iOS 10.2 - Logicsaurus Rex

25

我认为 Bryan 的答案是不可行的,因为更改项目设置中的方向也会像 @mrhangz 评论的那样更改 info.plist

如果问题仅限于 iOS9,则可能是由于 iPad 中名为 Split view 的新功能所致。iOS9 默认在特定 iPad 设备上启用了 Split view,请参见苹果文档此处

enter image description here split view 强制你的应用程序在所有视图中支持所有方向,一旦采用就是这样。因此,如果你在 info.plist 或目标通用设置中设置了所有方向的支持,那么默认情况下会支持 split view,它将忽略 viewController 中的 supportedInterfaceOrientations 方向设置并支持所有方向。

正如文档所述,如果你在目标设置中勾选了 Requires full screen,则您的应用程序将不支持 split view。现在,你可以再次在代码中控制方向。 enter image description here


这对我有用。我需要这个信息,我不知道它。 - 93sauu
2
对我没用。我在我的视图控制器中有-(BOOL)shouldAutorotate,但它从未被调用过,并且我已经勾选了“需要全屏”。据我所知,它一直都被勾选着。 - Logicsaurus Rex
使用 Xcode 9 并在 iPhoneX 上测试时,我发现同样的问题。覆盖似乎没有效果,关于 plist 修改和需要全屏的建议在我的测试中也没有影响结果。唯一似乎会影响结果的是在设置中锁定旋转,这适用于整个应用程序。想知道是否有人找到了使其工作的“秘密”,或者它仍然是一个谜。 - bduhbya

0

为了简单起见,对于iPad而言,如果info.plist中的Supported interface orientations (iPad)属性包括所有四个方向,并且UIRequiresFullScreen属性值为NO,iOS将视您的应用程序支持分屏视图。如果应用程序支持分屏视图功能,则无法通过上述方式禁用其旋转。

我在这里有一个详细的答案。


0

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

iOS 8和9不需要编辑info.plist。

- (BOOL) shouldAutorotate {
 return NO;
 }   



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

可能的方向

UIInterfaceOrientationUnknown

设备的方向无法确定。

UIInterfaceOrientationPortrait

设备处于纵向模式,设备直立并且主页按钮在底部。

UIInterfaceOrientationPortraitUpsideDown

设备处于纵向模式但是上下颠倒,设备直立并且主页按钮在顶部。

UIInterfaceOrientationLandscapeLeft

设备处于横向模式,设备直立并且主页按钮在左侧。

UIInterfaceOrientationLandscapeRight

设备处于横向模式,设备直立并且主页按钮在右侧。


4
supportedInterfaceOrientations方法需要返回UIInterfaceOrientationMask而不是UIInterfaceOrientation,例如UIInterfaceOrientationMaskPortrait。请注意保持原意并简化语言。 - Aaron Zinman

0

在 Swift 5 中

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

private var _orientations = UIInterfaceOrientationMask.portrait
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    get { return self._orientations }
    set { self._orientations = .portrait }
}

这里可以找到更详细的解释: supportedInterfaceOrientations方法不会覆盖其超类中的任何方法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接