4

我有一个需要连接到外部显示器的应用程序,我想在两个屏幕上显示不同的内容(不仅仅是镜像 iPad 屏幕)。

我尝试在我的添加场景配置Info.plist

<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <true/>
    <key>UISceneConfigurations</key>
    <dict>
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>Default Configuration</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                <key>UISceneStoryboardFile</key>
                <string>Main</string>
            </dict>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>External Screen</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).ExtSceneDelegate</string>
                <key>UISceneStoryboardFile</key>
                <string>Ext</string>
            </dict>
        </array>
    </dict>
</dict>

UISceneConfiguration我还添加了一个开关来为每个屏幕返回正确的值。

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    switch connectingSceneSession.role.rawValue {
    case "UIWindowSceneSessionRoleApplication":
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    case "UIWindowSceneSessionRoleExternalDisplay":
        return UISceneConfiguration(name: "External Screen", sessionRole: connectingSceneSession.role)
    default:
        fatalError("No such role, I think? \(connectingSceneSession.role.rawValue)")
    }
}

虽然我在上面的代码中设置的断点在configurationForConnectingAppDelegate连接外部屏幕时被调用,但我的应用程序仍然只是镜像 iPad 屏幕。

我尝试按照本教程进行操作,但由于 iOS 13screen不推荐使用 setter,并且此代码不起作用。

我真的不知道如何在不同的物理屏幕上显示不同的内容,有人能指出我正确的方向吗?

4

2 回答 2

5

rmaddy 的回答部分正确,configurationForConnecting代码是不必要的。但是我的Info.plist. 错误是我将两种配置都分配给了UIWindowSceneSessionRoleApplication角色。它应该是这样的:

<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <true/>
    <key>UISceneConfigurations</key>
    <dict>
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>Default Configuration</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                <key>UISceneStoryboardFile</key>
                <string>Main</string>
            </dict>
        </array>
        <key>UIWindowSceneSessionRoleExternalDisplay</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>External Screen</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).ExtSceneDelegate</string>
                <key>UISceneStoryboardFile</key>
                <string>Ext</string>
            </dict>
        </array>
    </dict>
</dict>

外部屏幕配置位于UIWindowSceneSessionRoleExternalDisplay按键下方。

这就像一个魅力。我确实必须将此代码添加到其中willConnectToExtSceneDelegate使其充满屏幕:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    windowScene.screen.overscanCompensation = .none
}
于 2019-10-17T11:56:08.047 回答
2

如果要在 Info.plist 中设置场景配置,请不要实现configurationForConnectingUIApplicationDelegate 方法。所以从注释掉那个方法开始。

给定场景配置的 Info.plist 设置,将为外部屏幕自动创建一个窗口场景。将为您创建一个类的实例,ExtSceneDelegate它将与您的“Ext”故事板连接。

检查控制台是否有任何错误。如果您的场景配置或外部故事板有任何问题,您将只会看到主故事板的镜像,而不是外部故事板。

还要确保你的实现willConnectTo没有ExtSceneDelegate做任何事情来阻止正确的场景设置。什么都不做的默认实现就是将外部故事板连接到外部屏幕上自动创建的窗口。

于 2019-10-16T16:53:51.450 回答