Есть ли способ разрешить режим ландшафта только в одном контроллере просмотра в приложении?
Вы сами ответили на вопрос, см. Раздел «Configuring the View Rotation Settings» в описании класса UIViewController. Вам нужно настроить приложение для поддержки всех поворотов, которые вы хотите, а затем переопределить каждый контроллер представления, и да, это утомительно, но это работает :)
Обработка Просмотр Ротации На прошивке 8, все ротационное связанные с этим методы: устарели. Вместо этого вращения обрабатываются как изменение размера вида контроллера вида и поэтому сообщаются с использованием метода viewWillTransitionToSize: withTransitionCoordinator :. Когда изменяется ориентация интерфейса , UIKit вызывает этот метод в контроллере корневого представления окна. Затем этот контроллер представления уведомляет о своих дочерних контроллерах представления , распространяя сообщение по всему представлению .
В iOS 6 и iOS 7 ваше приложение поддерживает ориентацию интерфейса , определенную в файле Info.plist вашего приложения. Контроллер вида может переопределить метод supportedInterfaceOrientations, чтобы ограничить список поддерживаемых ориентаций . Как правило, система называет этот метод только на контроллере корневого представления окна или контроллере представления , который представлен для заполнения всего экрана; контроллеры детского просмотра используют часть окна, предоставленную для них по их родительскому виду , и больше не участвуют непосредственно в принятии решений о том, что поддерживаются вращениями . Пересечение ориентации приложения маска и маска ориентации диспетчера вида используются для определения , с помощью которых можно поворачивать ориентации контроллера вида.
Вы можете переопределить предпочтительныйInterfaceOrientationForPresentation для контроллер представления, который предназначен для представления полного экрана в определенной ориентации .
Когда вращение происходит для видимого контроллера зрения, willRotateToInterfaceOrientation: Длительность :, willAnimateRotationToInterfaceOrientation: Продолжительность :, и didRotateFromInterfaceOrientation: методы вызываются во время вращения. Метод viewWillLayoutSubviews также вызывается после того, как вид изменяется и позиционируется его родителем. Если контроллер вида не отображается при изменении ориентации, то методы вращения никогда не вызываются. Однако, когда вид становится видимым, вызывается метод viewWillLayoutSubviews . Ваша реализация этого метода может вызвать метод statusBarOrientation для определения ориентации устройства .
EDIT
Вы также можете посмотреть на UIApplicationDelegate Protocol, она имеет метод
func application(application: UIApplication,
supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask
Из документации:
Обсуждение
Этот метод возвращает общий набор ориентаций интерфейса , поддерживаемых приложением. При определении того, следует ли вращать конкретный контроллер просмотра , ориентации, возвращаемые этим методом, равны , пересекающимся с ориентациями, поддерживаемыми корневым представлением контроллера или верхнего представленного контроллера представления. Контроллер приложения и просмотра должен согласовать до разрешения вращения.
Если вы не реализуете этот метод, приложение использует значения в ключе UIInterfaceOrientation в файле Info.plist в качестве интерфейса по умолчанию .