Когда необходимо настроить полноэкранный режим AVPlayer
для поддержки альбомной ориентации в приложении только для портретов, наиболее распространенной рекомендацией является добавление AVFullScreenViewController
в качестве исключения и включение поддержки альбомной ориентации.Например, добавьте сравнение для этого имени класса в метод supportedInterfaceOrientations(for:)
в вашем AppDelegate
.
Однако, он никогда не работал для меня (хотя я проверял это только в iOS 11), и мне пришлось добавить такойисключение для моего UIViewController
подкласса, который содержит видео в качестве подпредставления.(И в моем случае сделать обходной путь, чтобы этот контроллер представления поддерживал только портретный режим, когда видео не в полноэкранном режиме, а также ориентацию портрета и ландшафта, когда видео в полноэкранном режиме.)
Удивительнодостаточно, это не работает в iOS 12. Небольшое исследование обнаружило, что Apple изменила механизм полноэкранного представления в AVKit внутренне.(Заметный знак избегать использования внутренних API.)
Предыдущая версия иерархии представлений основана на экземпляре UIWindow
, который содержит UITransitionView
, и параллельно вы просматриваете иерархию.UITransitionView
содержит этот AVFullScreenViewController
экземпляр.( снимок экрана iOS11 )
Иерархия представлений версии iOS 12 выглядит совсем иначе: на этот раз два окна.Первый знакомый UIWindow
, который содержит вашу иерархию представлений.Второй для меня новый - экземпляр AVWindow
, который содержит UITransitionView
с AVFullScreenViewController
внутри и неопределенным подклассом UIViewController
в качестве родного брата.( скриншот iOS12 )
Когда я пытаюсь повернуть экран, supportedInterfaceOrientations
метод вызывается как для AVFullScreenViewController
, так и для этого неизвестного UIViewController
подкласса.(Точнее, я не могу быть уверен, что именно для этого подкласса UIViewController
вызывается supportedInterfaceOrientations
, но, скорее всего, так и есть.)
Итак, кто-нибудь еще сталкивался с этой проблемой?Есть ли решение или обходной путь?
Спасибо за ваше участие заранее *
PS Прошу прощения за закрашивание внутренних имен классов, эти скриншоты взяты из проекта моей компании.
PPS На данный момент я поддержал все ориентации окна в моем AppDelegate
и переопределил supportedInterfaceOrientations
в каждом подклассе контроллера представления для поддержки только портретного.