Каков наилучший способ заставить вращаться контроллер представления, который не виден?

Я просмотрел Stack Overflow и не нашел ничего, что могло бы решить мою конкретную проблему. Я работаю над приложением, которое использует настраиваемое представление вкладок для переключения между 4 различными навигационными контроллерами. Проблема, с которой я сталкиваюсь, заключается в том, что при повороте устройства и последующем переключении на другую вкладку контроллер представления, который становится видимым, по-прежнему отображается для старой ориентации. Я использовал willRotateToInterfaceOrientation:duration: для выполнения любой подготовки к конкретной ориентации, которую я хочу, используя новую ориентацию, которая работает, как и ожидалось, когда VC виден, но я понимаю, что методы поворота не вызываются для контроллеров представления, которые не видны в время вращения.

В документации Apple говорится:

Повороты могут происходить, когда ваш контроллер представления скрыт

Если содержимое вашего контроллера представления не отображается на экране, когда происходит вращение, то он не видит список сообщений о вращении. Например, рассмотрим следующую последовательность событий:

  1. Ваш контроллер представления представляет содержимое другого контроллера представления в полноэкранном режиме.
  2. Пользователь поворачивает устройство, чтобы изменить ориентацию пользовательского интерфейса.
  3. Ваше приложение отклоняет представленный контроллер представления.

В этом примере контроллер представления представления не был виден, когда произошло вращение, поэтому он не получает никаких событий вращения. Вместо этого, когда он появляется снова, его представления просто изменяются в размерах и позиционируются с использованием обычного процесса компоновки представлений. Если вашему коду макета необходимо знать текущую ориентацию устройства, он может прочитать свойство statusBarOrientation объекта приложения, чтобы определить текущую ориентацию.

У меня есть несколько идей, как справиться с этим, но я не уверен, что лучше. У каждого из них есть свои плюсы и минусы. Мое текущее решение в основном состоит в том, чтобы дублировать все, что я делаю в willRotateToInterfaceOrientation:duration:, в viewWillAppear, чтобы контроллер представления, который не был виден при вращении, мог внести коррективы для новой ориентации, прежде чем она станет видимой. Моя другая идея заключалась в том, чтобы переместить мой код ориентации из willRotateToInterfaceOrientation:duration: в viewWillLayoutSubviews, который вызывается как при повороте контроллера представления, когда он виден, так и когда он становится видимым после того, как его не было. Проблема в том, что методы макета могут вызываться довольно часто, даже если поворота не произошло. Еще один вариант — зарегистрировать мои контроллеры представления для UIDeviceOrientationDidChangeNotification, которые, как я полагаю, получат мои VC независимо от того, видны они или нет, хотя я не проверял это.

Я предполагаю, что это довольно распространенная проблема, и мне интересно... Каковы решения всех остальных? Есть ли лучший способ справиться с этим, чем решения, которые я придумал?

Спасибо!


person Laura Brown    schedule 28.08.2014    source источник


Ответы (1)


Да, добавление наблюдателя в UIDeviceOrientationDidChangeNotification должно помочь вам достичь этого.

person rahulinaction    schedule 29.08.2014
comment
Я не видел вашего ответа до сих пор. Спасибо за вклад, вот как я закончил делать вещи. - person Laura Brown; 21.10.2014