Несколько представленных контроллеров представления и вращение на iPad

Недавно я столкнулся с проблемой при переносе некоторого кода из приложения iPhone на iPad. Это может быть связано с проблемой, описанной здесь , хотя я нашел объяснения/решения этого вопроса неудовлетворительными. Сценарий таков::

  1. Контроллер представления 'A' (Контроллер корневого представления )представляет модальный контроллер представления (, назовем его 'B' )с модальным стилем представления "Лист формы".

  2. Контроллер представления В представляет контроллеру представления «С» модальный стиль представления «Полный экран».

  3. iPad вращается, в то время как контроллер представления C является верхним -наиболее представленным контроллером представления.

  4. После закрытия C, B снова -отображается, но имеет неправильную ориентацию.

Насколько я могу судить, не должно быть проблем с цепочкой нескольких представленных контроллеров представления --, на самом деле, это поведение явно поддерживается в документации Представление контроллеров представления из других контроллеров представления .. Я также прочитал следующее утверждение в Примечания к выпуску iOS 5:

Обратные вызовы вращения в iOS 5 не применяются к контроллерам представления, которые представлены в полноэкранном режиме. Это означает, что если ваш код представляет контроллер представления поверх другого контроллера представления, а затем пользователь впоследствии поворачивает устройство в другую ориентацию, после увольнения базовый контроллер (, т.е. представляющий контроллер ), не получит никакого поворота. обратные вызовы. Однако обратите внимание, что представляющий контроллер получит вызов viewWillLayoutSubviews при его повторном отображении, а свойство interfaceOrientation можно запросить из этого метода и использовать для правильного размещения контроллера.

Насколько я могу судить,этого не происходит --Контроллер представления B получает вызов -shouldAutoRotateToInterfaceOrientation, но значение параметра interfaceOrientation в этом вызове является значением ориентации интерфейса контроллера представления B, когда он представляет контроллер представления C, а не значение ориентации интерфейса C при увольнении. Поскольку мы работаем на iPad, все эти контроллеры представления возвращают YES в -shouldAutoRotateToInterfaceOrientation. Таким образом, границы представления B никогда не меняются, поэтому -willLayoutSubviews никогда не вызывается.

Я попытался сохранить ориентацию контроллера представления C в обратном вызове для B, прежде чем B отклонит его, а затем использовать эту информацию в следующий раз, когда -shouldAutoRotateToInterfaceOrientation вызывается и возвращает YES только для ориентации C, когда он отклоняется. Это исправляет сломанный пользовательский интерфейс, который появляется без этой проверки, но контроллер представления B не обновляет ориентацию своего интерфейса до этого значения, поэтому последующие модальные презентации будут анимироваться с неправильной стороны устройства.

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

Заранее спасибо.

7
задан Community 23 May 2017 в 12:03
поделиться