Путаница делегатов в альбомной и портретной ориентации iOS

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

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

Второй — с модально представленным экраном (из этой основной области взаимодействия), который воспроизводит видео YouTube из приложения с помощью UIWebView, опять же, это работает хорошо.

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

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { }

Я приложу скриншоты того, что именно происходит.

Основная область взаимодействия

Скриншот основной области взаимодействия в портретном режиме.

ландшафтный режим

Скриншот основной области взаимодействия в ландшафтном режиме.

ландшафтный режим после выхода из модального окна

Скриншот основной области взаимодействия после закрытия контроллера модального представления в ландшафтном режиме и возврата к основной области взаимодействия (обратите внимание, что содержимое центрировано, верхняя часть обрезана и не растягивается (не то, чтобы я попросить его сделать это)

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

Какие-либо предложения? Опять же, я рад опубликовать код. Заранее спасибо.

изменить

ОТВЕЧАТЬ:

Так просто, я взял код, который помещает альбомное представление поверх стека представлений при включении в его собственном методе. Затем я вызываю этот метод как в методе делегата, в котором он ранее находился, так и в ViewWillAppear.


person achi    schedule 09.08.2012    source источник


Ответы (1)


Система отправляет willRotateToInterfaceOrientation: контроллеру представления только в том случае, если этот контроллер представления управляет представлением верхнего уровня на экране. Поскольку вы представляете контроллер модального представления, контроллер модального представления получает willRotateToInterfaceOrientation:, а ваш (скрытый) контроллер представления - нет.

Система отправляет viewWillAppear: контроллеру представления, когда представление контроллера представления собирается снова появиться, потому что контроллер модального представления исчезает. Итак, вы должны реализовать viewWillAppear:. В этом методе проверьте, находится ли интерфейс в альбомной ориентации. Если это так, покажите свой альбомный вид. В противном случае скройте свой альбомный вид.

person rob mayoff    schedule 09.08.2012
comment
Или сделайте метод делегата в контроллере модального представления, чтобы вращать скрытый контроллер, когда вызывается willRotatejfjtdtdhtdhmgc - person Dustin; 09.08.2012
comment
Нет причин поворачивать представление скрытого контроллера, если вы не знаете, что представление вот-вот появится. Сделайте это в viewDidAppear: или каком-либо другом методе (например, layoutSubviews или viewWillLayoutSubviews), который система вызывает, когда гарантировано, что представление будет показано. - person rob mayoff; 09.08.2012
comment
Убрав то, что у меня было в этом методе делегата, поместив его в собственный метод и вызвав этот метод как в делегате, так и в viewWillAppear, сработало. Решение оказалось таким простым, спасибо :) - person achi; 09.08.2012