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