У меня есть приложение для iPhone, которое использует UINavigationController
для представления интерфейса детализации: сначала одно представление, затем другое, до четырех уровней в глубину. Я хочу, чтобы первые три вида были ограничены портретной ориентацией, и только последний вид должен иметь возможность вращаться в альбомную. При возврате из четвертого вида к третьему и четвертому виду в альбомной ориентации я хочу, чтобы все повернулось обратно в портретную ориентацию.
В iOS 5 я просто определил shouldAutorotateToInterfaceOrientation:
в каждом из своих контроллеров представления, чтобы он возвращал YES для допустимых ориентаций. Все работало, как описано выше, включая возврат к портретной ориентации, даже если устройство удерживалось в альбомной ориентации при возврате из контроллера представления №4 в №3.
В iOS 6 все контроллеры представления вращаются в альбомную ориентацию, нарушая те, которые не были предназначены. В примечаниях к выпуску iOS 6 говорится
Больше ответственности переносится на приложение и его делегата. Теперь контейнеры iOS (такие как
UINavigationController
) не консультируются со своими дочерними элементами, чтобы определить, следует ли им выполнять авторотацию. [...] Система запрашивает самый верхний полноэкранный контроллер представления (обычно корневой контроллер представления) о поддерживаемых ориентациях интерфейса всякий раз, когда устройство вращается или когда контроллер представления представлен в полноэкранном модальном стиле представления. Более того, поддерживаемые ориентации извлекаются, только если этот контроллер представления возвращает YES из своегоshouldAutorotate
метода. [...] Система определяет, поддерживается ли ориентация, пересекая значение, возвращаемое методом приложения,supportedInterfaceOrientationsForWindow:
со значением, возвращаемымsupportedInterfaceOrientations
методом самого верхнего полноэкранного контроллера.
Итак, я создал подклассы UINavigationController
, присвоил своему MainNavigationController
логическому свойству landscapeOK
и использовал его, чтобы вернуть допустимые ориентации supportedInterfaceOrientations
. Затем в каждом из моих viewWillAppear:
методов контроллеров представления у меня есть такая строка
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
сказать мне MainNavigationController
желаемое поведение.
Возникает вопрос: если я сейчас перейду к своему четвертому виду в портретном режиме и переверну телефон, он повернется в альбомный. Теперь я нажимаю кнопку «Назад», чтобы вернуться к третьему виду, который должен работать только в портретной ориентации. Но не вращается назад. Как мне это сделать?
Я попытался
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
в viewWillAppear
методе моего третьего контроллера представления, но он ничего не делает. Это неправильный метод вызова или, может быть, неправильное место для его вызова, или я должен реализовать все это совершенно по-другому?