我正在测试一个 Beta 版应用程序,并且遇到了外部屏幕的问题。
我们在应用程序周围看到黑色边框,我们之前可以通过设置overscanCompensation
来纠正,.none
但在 iOS 13 中,该设置根本没有任何效果。
我们曾经看到一个错误,说它应该在 UIScene 上设置(我们没有使用它)但错误只在调试器中出现过一次(令人沮丧!)
有什么想法吗?
选项 1.您是否尝试过延迟设置过扫描补偿?就像在几毫秒后设置它?
选项 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>
您收到该调试器错误是因为您不在主队列中。您需要做的就是将辅助屏幕设置包装在 DispatchQueue.main.async{} 中。
DispatchQueue.main.async {
// Setup your UIScreen here
}
如果您正在响应 didConnectNotification,谁知道您在哪个线程上收到通知。