如何在iOS 13的不同屏幕上显示不同的内容?

时间:2019-10-16 14:09:30

标签: ios ios13 external-display

我有一个需要连接到外部显示器的应用程序,我想在两个屏幕上显示不同的内容(而不仅仅是镜像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)")
    }
}

虽然在连接外部屏幕时调用了我在configurationForConnecting的{​​{1}}的{​​{1}}中的上述代码中设置的断点,但我的应用程序仍简单地镜像了iPad屏幕。

我尝试遵循this tutorial,但是自iOS 13起,AppDelegate设置器已被弃用,此代码不起作用。

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

2 个答案:

答案 0 :(得分:3)

rmaddy的回答部分正确,return代码不是必需的。但是我的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中的willConnectTo中,以使其填满屏幕:

ExtSceneDelegate

答案 1 :(得分:2)

如果要在Info.plist中设置场景配置,请不要实现configurationForConnecting UIApplicationDelegate方法。因此,从注释该方法开始。

鉴于场景配置的Info.plist设置,将自动为外部屏幕创建一个窗口场景。将为您创建ExtSceneDelegate类的实例,并将其与“ Ext”情节提要关联。

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

还要确保您在willConnectTo中对ExtSceneDelegate的实现没有采取任何措施来阻止正确的场景设置。您只需要将外部情节提要板连接到外部屏幕上自动创建的窗口,就可以执行默认操作。