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