如何在iPad上运行的iPhone SwiftUI应用中锁定纵向方向?

4
我有一个使用SwiftUI编写的仅支持 iPhone 的应用程序,其方向被锁定在纵向,运行正常。然而,当在 iPad 上运行相同的应用程序(在仿真模式下;iPad不是目标设备)时,锁定无效:界面会随着设备旋转,这是不想要的,因为它会破坏界面。这在模拟器和实际设备上都失败了。
我可以使用仅包含单个视图的空 SwiftUI 项目重现此问题。
struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
    }
}

iPhone表现正常:

纵向模式的iPhone 横向模式的iPhone

iPad不尊重方向锁定:

纵向模式的iPad 横向模式的iPad

我在 Info.plist 中添加了以下内容,但是没有成功。iPad 仍然会旋转 UI。

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
</array>

然后我定义了一个AppDelegate。但仍然没有成功,UI在iPad上仍然保持旋转状态。

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.portrait
    }
}

@main
struct orientationApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

有趣的地方:

  • 当我将iPad作为目标启用时,方向锁定可以直接使用。然而,我并不想将该应用程序提供给iPad用户。我只是想为那些故意在其iPad上安装iPhone应用程序的用户修复UI。
  • 当我在iPhone上测试AppDelegate方法时,即使在Info.plist中允许所有设备方向,它也可以正常工作,所以它似乎做了正确的事情(只是在iPad上没有)。

我正在使用Xcode 12.5和Swift 5。


请看我在这里的答案:https://stackoverflow.com/a/64046367/5575955 - Fabio
谢谢,Fabio,但我已经做过了。就像我上面写的那样,在我的Info.plist文件中,我只有一个UISupportedInterfaceOrientations~ipad项目,即UIInterfaceOrientationPortrait。我已经删除了其他3个——但它仍然不起作用。 - Dominik
你的 info.plist 文件中是否也设置了 UISupportedInterfaceOrientations 键(不带 "~ipad")?只是一个想法。 - West1
是的,我拿到了这两个代码片段: <key>UISupportedInterfaceOrientations</key><array><string>UIInterfaceOrientationPortrait</string></array><key>UISupportedInterfaceOrientations~ipad</key><array> <string>UIInterfaceOrientationPortrait</string></array> - Dominik
1个回答

5

enter image description here

取消勾选“支持多窗口”对我解决了这个问题。

1
谢谢,@i4guar,我不明白为什么,但这确实有效,太神奇了! - Dominik
@Dominik,这是因为要支持多窗口,您必须支持所有设备方向(我猜他们知道您能处理不同大小的窗口)。 - CMash

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