在 iOS 14 中锁定屏幕方向

Posted

技术标签:

【中文标题】在 iOS 14 中锁定屏幕方向【英文标题】:Locking screen orientation in iOS 14 【发布时间】:2021-03-07 14:54:41 【问题描述】:

我正在更新一个旧的 iPad 应用程序,但我无法阻止 ios 旋转一个只能在纵向模式下查看的控制器。该应用程序有一个UISplitViewController,但有一次我需要在纵向模式下全屏显示另一个控制器,无论 iPad 之前是纵向还是横向。

我有两个问题:

如果 UI 处于横向模式,纵向视图控制器也会以横向显示 不再阻止旋转,因此即使控制器以正确的方向显示,用户也可以旋转设备

documentation 表示所有与旋转相关的方法在 iOS 8 中都已弃用,而 iOS 将在窗口的根视图控制器上调用 viewWillTransitionToSize。因此,我打电话给[window setRootViewController] 来设置我的纵向控制器,实际上iOS 在我的控制器上调用viewWillTransitionToSize。然而,到那时已经太迟了!我需要在过渡开始之前停止它。

在花了很多时间谷歌搜索和尝试变体之后,我离解决方案还差得远——网上(以及 Stack Overflow 上的这里)上有太多旧东西,很难找到最新信息。

我尝试在viewDidLoadviewWillAppearviewDidAppear 中设置modalPresentationStyle = UIModalPresentationFullScreen,然后覆盖preferredInterfaceOrientationForPresentation。我的覆盖永远不会被调用。

我仍然有旧方法 supportedInterfaceOrientationsshouldAutorotateshouldAutorotateToInterfaceOrientation,但它们都没有被调用过。

我尝试在我的应用委托中实现application:supportedInterfaceOrientationsForWindow,但从未调用过该方法。 (来自this question的答案)

在 iOS 14 上执行此操作的正确方法是什么?我应该使用模态全屏演示吗?或者以某种方式使用 UITraitCollection 的 trait 环境?

【问题讨论】:

【参考方案1】:

除非您明确选择退出 iPad 多任务处理,否则您不能以任何方式阻止 iPad 应用程序 采用所有四个旋转位置,而 实际上 采用所有四个旋转位置。

为此,请将 Info.plistUIRequiresFullScreen 设置为 YES;您可以在编辑应用程序目标时方便地执行此操作,方法是选中“常规”选项卡中的“需要全屏”。

但苹果警告说这个选项将被删除;多任务处理将成为一项要求,因此也需要轮换到任何位置。基本上改变你的愿望会更好。

【讨论】:

谢谢马特,我已经在应用程序目标的常规选项卡中检查了“需要全屏”。它没有效果,但我发现 Info.plist 文件中有 两个 标志:UIRequiresFullScreenUIRequiresFullScreen-ipad。一旦我在<target>-Info.plist 中将 iPad 标志设置为 yes,它就完美运行了! 同时拥有这两个标志很愚蠢,因为无论如何此设置仅在 iPad 上才有意义。只需删除第二个就足够了。引入第二个标志一直是一个错误。删除它,让第一个完成它的工作。 但是,正如我所说,您最好接受不可避免的事情并让设备旋转。 是的,如果我今天设计这个应用程序,我会这样做 - 但这是一个 2009 年的古老应用程序,我一直在保持活力。如果/当多任务成为强制性时,我意识到我将不得不做更多的返工,但现在我很高兴有一个工作应用程序!【参考方案2】:

我曾针对 Ipad 提出过类似的问题,但由于这个问题而被关闭。 我的 Ipad IOS 14.5 和 VisualStudio2019 解决方案是在 InfoPlist 中添加这些行。 (对于像我这样的初学者:不要打开Manifest Mask,右键单击IOS Header下的“infoPlist”并选择“view Code”。)然后添加这些缺失的行:

<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>    <!--For Vertikal-->
<string>UIInterfaceOrientationLandscapeLeft</string> <!--For Horizontal-->
<string>UIInterfaceOrientationLandscapeRight</string> <!--For Horizontal-->
</array>

【讨论】:

以上是关于在 iOS 14 中锁定屏幕方向的主要内容,如果未能解决你的问题,请参考以下文章

Vaadin Touchkit / Web 应用程序 - 锁定移动屏幕方向

Android 锁定屏幕放心

Flutter:如何按需设置和锁定屏幕方向

Android中Activity运行时屏幕方向与显示方式详解

在 iPad 上锁定 UIViewController 方向

iOS 方向在特定屏幕上支持横向和纵向 - 不是所有屏幕