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



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

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

我尝试按照本教程进行操作,但从 iOS 13 开始,screensetter 已被弃用,并且此代码不起作用。

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

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键下的位置。

这就像一个魅力。我确实必须将此代码添加到ExtSceneDelegate中的willConnectTo中,以使其填满屏幕:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
windowScene.screen.overscanCompensation = .none
}

如果要在 Info.plist 中设置场景配置,请不要实现configurationForConnectingUIApplicationDelegate 方法。因此,首先注释掉该方法。

给定场景配置的 Info.plist 设置,将自动为外部屏幕创建窗口场景。将为您创建ExtSceneDelegate类的实例,该实例将与"Ext"情节提要连接。

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

还要确保在ExtSceneDelegate中实现willConnectTo不会阻止正确的场景设置。不执行任何操作的默认实现是将外部情节提要连接到外部屏幕上自动创建的窗口所需的全部内容。

相关内容

  • 没有找到相关文章

最新更新