0

Я работаю над iOS 6.1 и 7.0. Поведение одинаково для обоих из них. Контроллер корневого представления - UIVeiwController. Он имеет свойство UINavigationViewController, которое управляет всеми отображаемыми контроллерами в моем приложении. Я подклассифицировал UINavigationController и перегрузил shouldAutorotate и supportedInterface методами вращения, чтобы получить правильные ориентации каждого контроллера, нажатого в нем.Контроллер UINavigation не уведомлен о правильных событиях.

Что я хочу: Нажимаем на навигацию 3 контроллера, второй контроллер должен быть только в портретной ориентации.

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

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

Вот ссылка проекта https://github.com/Trubianov/Navigation.git

ответ

0

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

При нажатии вещи внутри UINavigationController (или любой другой UIViewController контейнер), вы можете решить, на ребенка UIViewController то, что он поддерживает ориентацию, и операционная система будет заставить его работать на вас.

Мое предложение: если у вас есть собственный код, который вы должны иметь в своем UINavigationController подклассе, вы должны удалить его целиком и переместить проверки вращения на контроллерах зрения ребенка вы представляете

+0

Это не совсем правильно. «UINavigationController» иногда переопределяет настройки ориентации своих дочерних элементов. Я не играл с ним широко, но мне пришлось подклассифицировать UINavigationController для отображения только в портретном режиме, но в моем случае весь стек этого контроллера навигации должен был быть в портрете. Я не слишком хорошо знаком с настройками смешивания в стеке VC, но моя рекомендация по-прежнему должна быть очень уверена, что вам нужно заставить ориентацию только в одном VC –

0

Вот решение. Если вы поместите UIViewController в window.root, а ваш навигационный контроллер будет просто свойством корневого контроллера, то ваша навигация не получит соответствующих обратных вызовов из UIApplication, поэтому вы ДОЛЖНЫ добавить навигацию в качестве контроллера детского представления к вашему корневому контроллеру.

Мой фрагмент кода:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.backgroundColor = [UIColor whiteColor]; 
    MyNavigationController *navController = [[MyNavigationController alloc] initWithRootViewController:[ViewController1 new]]; 
    MainViewController *main = [MainViewController new]; 
    main.myNavigationController = navController; 
    [main addChildViewController:navController]; 
    self.window.rootViewController = main; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

Также необходимо переопределить следующие методы в MainViewController.

- (BOOL)shouldAutorotate 
{ 
    return [self.myNavigationController.topViewController shouldAutorotate]; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.myNavigationController.topViewController supportedInterfaceOrientations]; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return [self.myNavigationController.topViewController   preferredInterfaceOrientationForPresentation]; 
}