iOS 13 Beta的外部屏幕上的过扫描补偿

时间:2019-06-21 13:25:15

标签: ios swift ios13

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

我们在应用程序周围看到黑色边框,我们之前可以通过将overscanCompensation设置为.none来纠正该黑色边框,但是在iOS 13中,该设置完全无效。

我们曾经看到一个错误,指出应该在UIS​​cene上设置它(我们没有使用),但是错误仅在调试器中出现一次(令人沮丧!)

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

选项1。您是否尝试过延迟设置overscanCompensation?想要在几毫秒后设置它?

选项2。。您可能必须采用新的UISceneDelegate API。为了让它在我这边工作(没有情节提要),这是我要做的:

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>

答案 1 :(得分:0)

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

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

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