我正在Beta版上测试一个应用程序,并且遇到了外部屏幕问题。
我们在应用程序周围看到黑色边框,我们之前可以通过将overscanCompensation
设置为.none
来纠正该黑色边框,但是在iOS 13中,该设置完全无效。
我们曾经看到一个错误,指出应该在UIScene上设置它(我们没有使用),但是错误仅在调试器中出现一次(令人沮丧!)
有什么想法吗?
答案 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,谁知道您将在哪个线程上收到通知。