Как я могу отображать различный контент на разных экранах в iOS 13? - PullRequest
2 голосов
/ 16 октября 2019

У меня есть приложение, которое необходимо подключить к внешнему дисплею, и я хочу отображать разное содержимое на обоих экранах (не только зеркально отображать экран iPad).

Я попытался добавить конфигурацию сцены вmy Info.plist:

<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <true/>
    <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>
                <key>UISceneStoryboardFile</key>
                <string>Main</string>
            </dict>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>External Screen</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).ExtSceneDelegate</string>
                <key>UISceneStoryboardFile</key>
                <string>Ext</string>
            </dict>
        </array>
    </dict>
</dict>

Я также добавил переключатель для возврата правильного UISceneConfiguration для каждого экрана.

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    switch connectingSceneSession.role.rawValue {
    case "UIWindowSceneSessionRoleApplication":
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    case "UIWindowSceneSessionRoleExternalDisplay":
        return UISceneConfiguration(name: "External Screen", sessionRole: connectingSceneSession.role)
    default:
        fatalError("No such role, I think? \(connectingSceneSession.role.rawValue)")
    }
}

В то время как точка останова, которую я установил в приведенном выше коде вconfigurationForConnecting в моем AppDelegate вызывается, когда я подключаю внешний экран, мое приложение все еще просто отражает экран iPad.

Я пытался следовать этому руководству , но с iOS 13 screen сеттер устарел, и этот код не работает.

Я действительно не знаю, как я могу отображать различный контент на разных физических экранах, кто-то может указать мне правильное направление?

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Если вы собираетесь настроить конфигурации сцены в Info.plist, не реализуйте метод configurationForConnecting UIApplicationDelegate. Итак, начните с закомментирования этого метода.

Учитывая ваши настройки Info.plist для конфигурации сцены, сцена окна будет автоматически создана для внешнего экрана. Для вас будет создан экземпляр вашего класса ExtSceneDelegate, который будет связан с вашей раскадровкой "Ext".

Проверьте консоль на наличие ошибок. Если есть какие-либо проблемы с конфигурацией вашей сцены или внешней раскадровкой, вы увидите только зеркало вашей основной раскадровки, а не внешнюю раскадровку.

Также убедитесь, что ваша реализация willConnectTo в вашем ExtSceneDelegateничего не делает для предотвращения правильной настройки сцены. Реализация по умолчанию, которая ничего не делает, - это все, что вам нужно, чтобы ваша внешняя раскадровка была подключена к автоматически созданному окну на внешнем экране.

1 голос
/ 17 октября 2019

Ответ от rmaddy был частично правильным, код configurationForConnecting не был необходим. Но в моем Info.plist была ошибка. Ошибка состояла в том, что я назначил обе конфигурации роли UIWindowSceneSessionRoleApplication. Это должно было быть так:

<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <true/>
    <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>
                <key>UISceneStoryboardFile</key>
                <string>Main</string>
            </dict>
        </array>
        <key>UIWindowSceneSessionRoleExternalDisplay</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>External Screen</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).ExtSceneDelegate</string>
                <key>UISceneStoryboardFile</key>
                <string>Ext</string>
            </dict>
        </array>
    </dict>
</dict>

Где конфигурация внешнего экрана находится под клавишей UIWindowSceneSessionRoleExternalDisplay.

Это работает как брелок. Мне нужно было добавить этот код к willConnectTo в моем ExtSceneDelegate, чтобы он заполнил весь экран:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    windowScene.screen.overscanCompensation = .none
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...