То, что появляется в приложении YouTube при переходе от экрана информации о фильме к реальному фильму, не является интерфейсом навигации - это модальное представление. Это всегда работает надежно: если вы отображаете вид модально (используя presentModalViewController
) и он может отображаться только в одной ориентации, приложение поворачивается в эту ориентацию.
Итак, решение состоит в том, чтобы не выдвигать свой ландшафтный вид в контроллер навигации; представить его как модальный вид.
Хорошо, но, возможно, вы хотите обмануть пользователя, заставив его поверить, что мы все еще находимся в интерфейсе навигации? Затем дайте модальному виду интерфейс навигации, настроенный так, чтобы он выглядел как основной интерфейс навигации! Поэтому, когда вы представляете модальное представление, пользователю будет казаться, что интерфейс навигации повернут (хотя анимация вращения не будет).
Теперь единственная проблема заключается в том, что интерфейс навигации в модальном представлении не имеет кнопки «Назад», если мы смотрим на его корневое представление. Это разрушает иллюзию (и затрудняет возвращение пользователя). Решением этой проблемы является хитрость: вставьте альбомную ориентацию дважды в интерфейс навигации, прежде чем представить ее как модальное представление. Таким образом, в интерфейсе навигации отображается представление second в стеке, и поэтому есть кнопка Back. Затем в делегате контроллера навигации поймайте кнопку «Назад» и отклоните модальное представление, когда пользователь пытается вернуться к тому уровню, который, как вы знаете, является корневым. Итак:
- (void) doButton: (id) sender { // appear to navigate into a landscape view
SecondViewController* sec = [[SecondViewController alloc] init];
sec.title = self.title; // to give the correct Back button title
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:sec];
SecondViewController* sec2 = [[SecondViewController alloc] init];
[nav pushViewController:sec2 animated:NO];
[self presentModalViewController:nav animated:YES];
nav.delegate = self; // so that we know when the user navigates back
}
// and here's the delegate method
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated {
if (viewController == [navigationController.viewControllers objectAtIndex:0])
[self dismissModalViewControllerAnimated:YES];
}