Вопрос или проблема
Я заметил, что официальная документация Apple для UIViewController описывает обработку поворота представления следующим образом:
Пересечение маски ориентации приложения и маски ориентации контроллера представления используется для определения, в какие ориентации контроллер представления может быть повёрнут.
Однако мои реальные тесты показывают иное. В AppDelegate я установил поддержку только [.portrait]:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
[.portrait]
}
В Root ViewController я реализовал метод supportedInterfaceOrientations:
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
.landscape
}
На моем iPad с iOS 17.6, похоже, что моё приложение поддерживает все направления поворота и не ограничено конкретным набором ориентаций.
Конечно, я также установил Requires Full Screen в YES и подтвердил с помощью точек останова, что вышеупомянутый метод действительно был вызван.
Я хотел бы знать, является ли это поведение тем, что официальная документация намеревалась донести.
Ответ или решение
Обработка конфликтующих масок ориентации между UIViewController и AppDelegate
Введение
Проблемы с обработкой ориентаций приложений в iOS могут привести к непредсказуемому поведению интерфейса, особенно когда речь идет о конфликтующих масках ориентации между UIViewController
и AppDelegate
. Официальная документация от Apple указывает, что решение о поддерживаемых ориентациях интерфейса определяется пересечением маски ориентации всего приложения и маски ориентации конкретного UIViewController
. Однако, в вашей ситуации, наблюдается поведение, которое не соответствует данным рекомендациям. Давайте подробно разберем эту проблему и предложим решение.
Проблема
В вашем AppDelegate
вы задали поддержку лишь вертикальной ориентации, а в Root ViewController
– лишь горизонтальную. Ожидаемое поведение в этом случае состоит в том, что приложение должно поддерживать лишь вертикальную ориентацию, как указано в методе supportedInterfaceOrientationsFor window:
.
Однако после тестирования на iPad с iOS 17.6 наблюдается, что приложение поддерживает все ориентации. Это отклонение от ожиданий является поводом для глубокого анализа и может возникнуть из-за нескольких причин.
Разбор конфликта
При анализе конфликта стоит учесть следующие моменты:
-
Маска ориентаций приложения: Ваша реализация метода
supportedInterfaceOrientationsFor window:
возвращает .portrait, что подразумевает, что приложение должно поддерживать только вертикальную ориентацию. Это общее правило для всего приложения. -
Маска ориентаций контроллера: Реализация
supportedInterfaceOrientations
в вашемRoot ViewController
, которая возвращает .landscape, создает конфликт с ограничениями, установленными вAppDelegate
. -
Приоритеты методов: Как указано в документации, конечная маска ориентаций формируется как пересечение масок, однако иногда поведение может быть непредсказуемым, если есть неучтенные настройки или другие факторы, такие как автоматическое управление роумингом во время изменения статуса интерфейса.
Решение
Чтобы устранить конфликт между вашим AppDelegate
и UIViewController
, следуйте этим рекомендациям:
-
Убедитесь в корректной реализации метода в AppDelegate: Проверьте, чтобы метод выглядел именно так:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return .portrait }
-
Измените реализацию в Root ViewController: Если ваше приложение должно поддерживать только вертикальную ориентацию, измените метод
supportedInterfaceOrientations
:override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }
-
Проверьте настройки экрана: Убедитесь, что в настройках вашего проекта
Requires Full Screen
установлено в YES, иначе ваше приложение может не соблюдать ожидаемое поведение. -
Тестирование: После внесения изменений проведите дополнительные тесты на разных устройствах и версиях iOS, чтобы убедиться в правильности работы ориентаций.
Заключение
Ориентационные маски могут создавать сложности, если не обеспечивается совместимость между различными компонентами приложения. Важно помнить, что конечное поведение зависит и от настроек самого проекта, и от реализации каждого элемента. Тщательное соответствие рекомендациям Apple поможет вам избежать возможных проблем и обеспечить стабильную работу приложения при изменении ориентации экрана.