2

我正在测试一个 Beta 版应用程序,并且遇到了外部屏幕的问题。

我们在应用程序周围看到黑色边框,我们之前可以通过设置overscanCompensation来纠正,.none但在 iOS 13 中,该设置根本没有任何效果。

我们曾经看到一个错误,说它应该在 UIScene 上设置(我们没有使用它)但错误只在调试器中出现过一次(令人沮丧!)

有什么想法吗?

4

2 回答 2

2

选项 1.您是否尝试过延迟设置过扫描补偿?就像在几毫秒后设置它?

选项 2。您可能必须采用新的UISceneDelegateAPI。为了让它在我身边工作(没有故事板),这是我必须做的:

SceneDelegate.swift

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }

    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = YourViewController(nibName: nil, bundle: nil)

    self.window = window
    window.makeKeyAndVisible()
}

如果您希望UIWindowSceneDelegate设备屏幕与外部屏幕不同,请在您的AppDelegate

// MARK: - UISceneSession Lifecycle

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {

    let sceneConfigurationName: String
    let delegateClass: AnyClass
    if connectingSceneSession.role == UISceneSession.Role.windowExternalDisplay {
        sceneConfigurationName = "External Display Configuration"
        delegateClass = SceneExternalDelegate.classForCoder()
    } else {
        sceneConfigurationName = "Default Configuration"
        delegateClass = SceneDelegate.classForCoder()
    }

    let sceneConfiguration = UISceneConfiguration(name: sceneConfigurationName, sessionRole: connectingSceneSession.role)
    sceneConfiguration.delegateClass = delegateClass
    return sceneConfiguration
}

func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    // Called when the user discards a scene session.
}

不要忘记设置delegateClass,这是让外部屏幕为我工作的缺失部分。

最后,Info.plist你应该在你的文件中注册这些UISceneConfigurations(如果需要,删除故事板引用):

<key>UIApplicationSceneManifest</key>
    <dict>
        <key>UIApplicationSupportsMultipleScenes</key>
        <false/>
        <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>
                </dict>
                <dict>
                    <key>UISceneConfigurationName</key>
                    <string>External Display Configuration</string>
                    <key>UISceneDelegateClassName</key>
                    <string>$(PRODUCT_MODULE_NAME).SceneExternalDelegate</string>
                </dict>
            </array>
        </dict>
    </dict>
</dict>
于 2019-09-07T09:00:46.513 回答
0

您收到该调试器错误是因为您不在主队列中。您需要做的就是将辅助屏幕设置包装在 DispatchQueue.main.async{} 中。

DispatchQueue.main.async {
    // Setup your UIScreen here
}

如果您正在响应 didConnectNotification,谁知道您在哪个线程上收到通知。

于 2019-09-19T03:35:14.753 回答