Дочерние UIViewControllers, не вызывающие shouldAutorotate - iOS 7

Итак, я просмотрел несколько страниц и нашел здесь несколько ответов о переполнении стека, но, похоже, ничего не работает.

У меня есть контроллер корневого представления. Он имеет 2 дочерних контроллера просмотра. (базовый вид контента и наложение меню).

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

В моем корневом VC я добавил свои дочерние представления следующим образом:

self.contentVC = [DELEGATE.storyboard instantiateViewControllerWithIdentifier:@"content"];
[self addChildViewController:self.contentVC];
self.contentVC.view.frame = self.view.bounds;
[self.view addSubview:self.contentVC.view];
[self.contentVC didMoveToParentViewController:self];

И root VC имеет следующие объявленные методы:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

-(BOOL)shouldAutomaticallyForwardAppearanceMethods{
    return YES;
}

-(BOOL) shouldAutomaticallyForwardRotationMethods{
    return YES;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

В моем conentVC:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

И в меню ВК:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate
{
    return NO;
}

Я программно решил это, просто заставив rootVC вызывать метод для contentVC, который позиционирует и поворачивает элементы, и сейчас это работает нормально. Меня больше всего беспокоит то, что если Apple добавит больше размеров экрана, автоповорот будет гораздо более адаптируемым. Есть ли решение для автоповорота, которое мне не хватает?

Как уже говорилось, я уже проверил несколько сообщений и знаю, что подобные вещи обсуждались, но все решения, которые я нашел, похоже, не работают.


person dave    schedule 30.05.2014    source источник


Ответы (2)


Вы неправильно поняли, что делает shouldAutomaticallyForwardRotationMethods. Он перенаправляет только эти методы (см. документацию, пожалуйста):

 willRotateToInterfaceOrientation:duration:
 willAnimateRotationToInterfaceOrientation:duration:
 didRotateFromInterfaceOrientation:

Платформе нет необходимости вызывать supportedInterfaceOrientations: и shouldAutorotate для дочерних элементов, потому что в настоящее время консультируются только с самым верхним контроллером представления. (Например, UINavigationController больше не консультируется со своим только что отправленным дочерним элементом.) Если ваш родитель хочет проконсультироваться со своими дочерними элементами, прекрасно; он должен просто идти вперед и консультироваться с ними. Но это ваше дело и не имеет ничего общего с shouldAutomaticallyForwardRotationMethods.

person matt    schedule 30.05.2014
comment
Спасибо за быстрый ответ. Уточнение по методам shouldAutomaticallyForwardRotationMethods сняло несколько вопросов. Def wasnt Есть ли способ отделить поведение поворота двух дочерних VC, чтобы один отвечал на autoRotate, а другой нет? Единственная причина, по которой я пытаюсь привязать оба дочерних VC к родительскому, — это уже существующая структура меню, изменение которой приведет к волновым эффектам, которые я действительно пытаюсь свести к минимуму здесь. - person dave; 30.05.2014
comment
Я не понимаю вашего второстепенного вопроса (развязка). С детьми ни в коем случае не советуются. Консультируются только с самым верхним контроллером представления (конечным родительским или представленным контроллером представления). Что происходит, зависит от ответа, который он дает. Я просто повторяюсь в этом месте. - person matt; 30.05.2014
comment
Мой вопрос: есть ли способ, чтобы только 1 из 2 дочерних контроллеров представления, которые я настроил, реагировал на автоматическое вращение в этом сценарии. Это моя цель, и мой первоначальный вопрос заключался в том, есть ли способ настроить это. Я сказал, что в настоящее время я реализовал методологию, которая «работает» для воспроизведения этого интерфейса — корневой виртуальный канал вызывает метод дочернего виртуальный канал, который он хочет повернуть, и этот метод обрабатывает поворот на этом экране. Я бы предпочел использовать автоповорот, если это возможно. - person dave; 30.05.2014
comment
Ни один из дочерних контроллеров представления не отвечает на автоматическое вращение, потому что ни один из них не будет и никогда не будет консультироваться с фреймворком. Что вы делаете, зависит от вас. Сейчас я повторился в третий раз. - person matt; 30.05.2014
comment
Слушай, у меня складывается впечатление, что тебя почему-то раздражает незнакомец, которому ты (почему-то) пытаешься помочь. Я понимаю, что ни один дочерний класс VC не консультируется фреймворком. Спасибо за ваше время, но я не прошу вас повторять какую-либо часть ваших предыдущих ответов. Я так понимаю, что фреймворк не консультируется с детьми ВК. - person dave; 30.05.2014
comment
Что я хочу сделать, так это в ландшафтном режиме, чтобы один дочерний VC отображал альбомную ориентацию, а другой оставался в портретной ориентации. Кажется, я не могу этого сделать. Содержимое кода выше — это просто настройка, которую я установил для контекста. Вы, кажется, сбиваете с толку, повторяя, что моя установка не работает - что видно из того, что я поставил вопрос для начала - с ответом на мой вопрос. - person dave; 30.05.2014
comment
И хотя я бы предпочел сохранить текущую родительско-дочернюю конфигурацию (из-за архитектуры, существующей в настоящее время в приложении), если единственный способ получить указанное поведение — пойти в другом направлении, пусть будет так. - person dave; 30.05.2014
comment
Я не вижу необходимости идти в каком-то новом направлении. Мне кажется, вы решили ее. Родитель может давать разные ответы на supportedInterfaceOrientations в разное время. Однако это не вызовет ротацию. Единственный способ вызвать вращение в iOS 7 — это использовать представленный контроллер представления, как я объяснял в различных местах, таких как stackoverflow.com/questions/22538461/ - person matt; 31.05.2014

Вы можете посмотреть меню «Ориентация устройства» в TARGETS-General-Deployment Info введите здесь описание изображения

person TengFeng Lian    schedule 17.07.2017
comment
Система пересекает поддерживаемые ориентации контроллера представления с поддерживаемыми ориентациями приложения (как определено файлом Info.plist или методом application:supportedInterfaceOrientationsForWindow: делегата приложения), чтобы определить, нужно ли поворачивать. bysupportedInterfaceOrientations - person TengFeng Lian; 19.07.2017