Зеркальное отображение внешнего экрана iOS13, появляется ошибка: не следует вызывать setScreen
Я пытаюсь представить настраиваемый контроллер представления на внешний подключенный экран в iOS 13. Я следовал этому руководству:
У меня есть следующий код:
/// A private method used to setup a external screen with a window
/// loaded with a ExternalScreenViewController
///
/// - parameter screen: A UIScreen object to connect the
/// ExternalScreenViewController too
private func setupExternalScreen(screen: UIScreen) {
guard externalWindow == nil,
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("ExternalScreen") as? ExternalScreenViewController else {
return
}
externalWindow = UIWindow(frame: screen.bounds)
externalWindow!.rootViewController = vc
externalWindow!.screen = screen
externalWindow!.hidden = false
}
В соответствии externalWindow!.screen = screen
Я получаю сообщение об ошибке в консоли Xcode 11.4.1:
[Assert] Ошибка в клиенте UIKit: -[UIWindow setScreen:] не должен вызываться, если клиент принимает жизненный цикл UIScene. Вызов - вместо этого [UIWindow setWindowScene:].
Контроллер пользовательского представления не отображается на внешнем дисплее.
Что я должен изменить? Я хочу работать как с iOS 13.x, так и с более ранними устройствами.
1 ответ
В устройствах iOS 13 вместо настройки screen
, вы должны установить windowScene
на externalWindow
объект. Перед этим следует выяснить соответствиеwindowScene
из UIApplication
Связанные сцены. Пересмотренный метод выглядит следующим образом:
private func setupExternalScreen(screen: UIScreen, shouldRecurse: Bool = true) {
// For iOS13 find matching UIWindowScene
var matchingWindowScene: UIWindowScene? = nil
if #available(iOS 13.0, *) {
let scenes = UIApplication.shared.connectedScenes
for aScene in scenes {
if let windowScene = aScene as? UIWindowScene {
// Look for UIWindowScene that has matching screen
if (windowScene.screen == screen) {
matchingWindowScene = windowScene
break
}
}
}
if matchingWindowScene == nil {
// UIWindowScene has not been created by iOS rendered yet
// Lets recall self after delay of two seconds
if true == shouldRecurse {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
self.setupExternalScreen(screen:screen, shouldRecurse: false)
}
}
// Dont proceed furthure in iOS13
return
}
}
guard externalWindow == nil, let vc = self.storyboard?.instantiateViewControllerWithIdentifier("ExternalScreen") as? ExternalScreenViewController else {
return
}
externalWindow = UIWindow(frame: screen.bounds)
externalWindow!.rootViewController = vc
if #available(iOS 13.0, *) {
// Set windowScene here, no need to set screen
externalWindow!.windowScene = matchingWindowScene
} else {
// Set screen the traditional way
externalWindow!.screen = screen
}
externalWindow!.isHidden = false
}
Примечание: мы должны установить isHidden
в качестве hidden
не рекомендуется.