Я просмотрел Stack Overflow и не нашел ничего, что могло бы решить мою конкретную проблему. Я работаю над приложением, которое использует настраиваемое представление вкладок для переключения между 4 различными навигационными контроллерами. Проблема, с которой я сталкиваюсь, заключается в том, что при повороте устройства и последующем переключении на другую вкладку контроллер представления, который становится видимым, по-прежнему отображается для старой ориентации. Я использовал willRotateToInterfaceOrientation:duration:
для выполнения любой подготовки к конкретной ориентации, которую я хочу, используя новую ориентацию, которая работает, как и ожидалось, когда VC виден, но я понимаю, что методы поворота не вызываются для контроллеров представления, которые не видны в время вращения.
В документации Apple говорится:
Повороты могут происходить, когда ваш контроллер представления скрыт
Если содержимое вашего контроллера представления не отображается на экране, когда происходит вращение, то он не видит список сообщений о вращении. Например, рассмотрим следующую последовательность событий:
- Ваш контроллер представления представляет содержимое другого контроллера представления в полноэкранном режиме.
- Пользователь поворачивает устройство, чтобы изменить ориентацию пользовательского интерфейса.
- Ваше приложение отклоняет представленный контроллер представления.
В этом примере контроллер представления представления не был виден, когда произошло вращение, поэтому он не получает никаких событий вращения. Вместо этого, когда он появляется снова, его представления просто изменяются в размерах и позиционируются с использованием обычного процесса компоновки представлений. Если вашему коду макета необходимо знать текущую ориентацию устройства, он может прочитать свойство statusBarOrientation объекта приложения, чтобы определить текущую ориентацию.
У меня есть несколько идей, как справиться с этим, но я не уверен, что лучше. У каждого из них есть свои плюсы и минусы. Мое текущее решение в основном состоит в том, чтобы дублировать все, что я делаю в willRotateToInterfaceOrientation:duration:
, в viewWillAppear
, чтобы контроллер представления, который не был виден при вращении, мог внести коррективы для новой ориентации, прежде чем она станет видимой. Моя другая идея заключалась в том, чтобы переместить мой код ориентации из willRotateToInterfaceOrientation:duration:
в viewWillLayoutSubviews
, который вызывается как при повороте контроллера представления, когда он виден, так и когда он становится видимым после того, как его не было. Проблема в том, что методы макета могут вызываться довольно часто, даже если поворота не произошло. Еще один вариант — зарегистрировать мои контроллеры представления для UIDeviceOrientationDidChangeNotification
, которые, как я полагаю, получат мои VC независимо от того, видны они или нет, хотя я не проверял это.
Я предполагаю, что это довольно распространенная проблема, и мне интересно... Каковы решения всех остальных? Есть ли лучший способ справиться с этим, чем решения, которые я придумал?
Спасибо!