Как применить ориентацию пользовательского интерфейса к сцене раскадровки iOS

Я разрабатываю приложение для iOS, которое позволяет кому-то играть в одну из двух разных игр.

Обе игры состоят из нескольких раундов. Когда игрок заканчивает раунд, приложение переходит к новой сцене, которая отображает результаты, а затем переходит либо к другой сцене раунда, либо к сцене финальной игры.

Из-за временного характера сцен в приложении нет особого смысла сохранять сцены, как это делается в более традиционных приложениях, где кто-то может вернуться к предыдущей сцене.

С этой целью в большинстве случаев навигация по сценам осуществляется с помощью UINavigationViewController и простого вызова setViewControllers(animated:), предоставляющего массив, содержащий только UIViewController для следующей сцены, и это работает достаточно хорошо.

Я упомянул, что приложение позволит кому-то играть в одну из двух игр. Оказывается, на iPhone в одну игру лучше всего играть в портретном режиме, а в другую лучше всего играть в ландшафтном режиме. Я хочу иметь возможность контролировать, какая ориентация пользовательского интерфейса используется для конкретного UIViewController, когда он становится активным.

Я экспериментировал с использованием свойства supportedInterfaceOrientations для UINavigationController и application(_ application: supportedInterfaceOrientationsFor window:) для UIApplicationDelegate и смог заставить все работать для стандартного приложения. Однако, когда я пытаюсь применить что-то к тому, как работает мое игровое приложение, используя setViewControllers(animated:), никакие методы, относящиеся к применению желаемой ориентации пользовательского интерфейса, похоже, не вызываются, и все сцены отображаются с одной и той же ориентацией.

Какие предложения есть у людей о том, как я могу заставить сцену в моем приложении отображаться с определенной ориентацией пользовательского интерфейса?


person Tron Thomas    schedule 28.07.2017    source источник


Ответы (1)


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

class func attemptRotationToDeviceOrientation()

Некоторые контроллеры представлений могут захотеть использовать специфические для приложения условия, чтобы определить, какие ориентации интерфейса поддерживаются. Если ваш контроллер представления делает это, когда эти условия изменяются, ваше приложение должно вызывать этот метод класса. Система немедленно попытается повернуться в новую ориентацию.

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621400-attemptrotationtodeviceorientati

person Pochi    schedule 28.07.2017
comment
Это интересно. Я добавил вызов UIViewController. tryRotationToDeviceOrientation в методе viewDidAppear для каждого контроллера представления. Оказывается, когда это происходит, к свойству supportInterfaceOrientations для каждого контроллера представления обращается доступ. Каждый контроллер представления, которому требуется особая ориентация, возвращает желаемую ориентацию, однако эффекта не наблюдается. Представления по-прежнему отображаются в одной и той же ориентации. - person Tron Thomas; 30.07.2017
comment
Свойство supportInterfaceOrientations получает доступ только в том случае, если UINavigationController изменен с простого использования setViewControllers(,animated: true) на вызов setViewControllers(,animated: true) с пустым массивом UIViewController для очистки всего, а затем вызывается pushViewController(,animated: true). Это не очень хорошо анимируется, и его использование в любом случае не решает проблему. - person Tron Thomas; 30.07.2017