Перед прошивкой 8, мы использовали ниже кода в сочетании с supportedInterfaceOrientations и shouldAutoRotate методов делегата , чтобы заставить ориентацию приложения к какой - либо конкретной ориентации. Я использовал приведенный ниже фрагмент кода, чтобы программно повернуть приложение в нужную ориентацию. Во-первых, я меняю ориентацию строки состояния. И затем просто представление и немедленное отклонение модального вида поворачивает вид в желаемую ориентацию.
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
Но это не работает в iOS 8. Кроме того, я видел некоторые ответы в переполнении стека, где люди предлагали, чтобы мы всегда избегали этого подхода с iOS 8 и далее.
Чтобы быть более конкретным, мое приложение является универсальным типом приложения. Всего три контроллера.
Контроллер First View - он должен поддерживать все ориентации в iPad и только портрет (кнопка «Домой» вниз) в iPhone.
Контроллер второго вида - он должен поддерживать только ландшафтное право в любых условиях
Контроллер третьего вида - он должен поддерживать только ландшафтное право в любых условиях
Мы используем навигационный контроллер для навигации по страницам. В первом контроллере представления при нажатии кнопки мы помещаем второй в стек. Таким образом, когда прибывает второй контроллер представления, независимо от ориентации устройства, приложение должно блокироваться только в горизонтальной плоскости.
Ниже мой shouldAutorotate
и supportedInterfaceOrientations
методы во втором и третьем представлении контроллера.
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeRight;
}
-(BOOL)shouldAutorotate {
return NO;
}
Есть ли какое-либо решение для этого или какой-либо лучший способ блокировки контроллера представления в определенной ориентации для iOS 8. Пожалуйста, помогите!
источник
Ответы:
Для iOS 7 - 10:
Objective-C:
Свифт 3:
Просто позвоните в
- viewDidAppear:
представленный контроллер представления.источник
[UIView setAnimationsEnabled:NO];
вviewWillAppear
и[UIView setAnimationsEnabled:YES];
вviewDidAppear
, связанных с : stackoverflow.com/a/6292506/88597[UINavigationController attemptRotationToDeviceOrientation];
Вращение ориентации немного сложнее, если вы находитесь внутри
UINavigationController
илиUITabBarController
. Проблема заключается в том, что если контроллер представления встроен в один из этих контроллеров, то контроллер навигации или панели вкладок имеет преимущество и принимает решения об авторотации и поддерживаемых ориентациях.Я использую следующие 2 расширения для UINavigationController и UITabBarController, чтобы контроллеры представления, встроенные в один из этих контроллеров, могли принимать решения.
Дайте View Controllers мощь!
Swift 2.3
Swift 3
Теперь вы можете переопределить
supportedInterfaceOrientations
метод или вы можете переопределитьshouldAutoRotate
в контроллере представления, который хотите заблокировать, иначе вы можете пропустить переопределения в других контроллерах представления, которые вы хотите наследовать по умолчанию, согласно ориентации, указанной в списке приложений.Отключить вращение
Блокировка для определенной ориентации
Теоретически это должно работать для всех сложных иерархий контроллера представления, но я заметил проблему с UITabBarController. По некоторым причинам он хочет использовать значение ориентации по умолчанию. См. Следующий пост в блоге, если вы хотите узнать, как обойти некоторые из проблем:
Блокировка поворота экрана
источник
Вот что сработало для меня:
https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation
Вызовите это в вашем viewDidAppear: метод.
источник
Я обнаружил, что если это представленный контроллер представления, вы можете переопределить
preferredInterfaceOrientationForPresentation
Swift:
источник
Этот способ работает для меня в Swift 2 iOS 8.x:
PS (этот метод не требует переопределения функций ориентации, таких как mustautorotate на каждом viewController, только один метод на AppDelegate)
Отметьте «требуется полный экран» в общей информации о вашем проекте.
Итак, на AppDelegate.swift сделайте переменную:
Итак, поместите также эту функцию:
Итак, в каждом классе вашего проекта вы можете установить эту переменную в viewWillAppear:
Если вам нужно сделать выбор в зависимости от типа устройства, вы можете сделать это:
источник
Прежде всего - это плохая идея, в общем, что-то не так с архитектурой вашего приложения, но
sh..t happens
, если это так, вы можете попробовать сделать что-то вроде ниже:Чем в
AppDelegate
И всякий раз, когда вы хотите изменить ориентацию, делайте так:
Примечание. Иногда устройство может не обновляться после такого вызова, поэтому может потребоваться выполнить следующие действия.
Вот и все
источник
Это должно работать с iOS 6 и выше, но я только протестировал это на iOS 8. Подкласс
UINavigationController
и переопределить следующие методы:Или спроси у видимого контроллера вид
и реализовать методы там.
источник
Это отзыв на комментарии в ответе Сида Шаха , касающиеся того, как отключить анимацию с помощью:
Код:
источник
Если вы используете navigationViewController, вы должны создать для этого собственный суперкласс и переопределить:
это отключит вращение в SecondViewController, но если вы нажмете свой SecondViewController, когда ваше устройство будет в портретной ориентации, то ваш SecondViewController появится в портретном режиме.
Предположим, что вы используете раскадровку. Вы должны создать ручной переход ( How to ) и в своем методе «onClick»:
Это заставит альбомную ориентацию, прежде чем ваш суперкласс отключит функцию автоматического поворота.
источник
По
Xcode 8
методам преобразуются в свойства, поэтому работает следующееSwift
:источник
portrait
режиме независимо от ориентации на iPad,shouldAutorotate
вернув истину, я достиг этого.Я пробовал много решений, но одно из них работало так:
Нет необходимости редактировать
info.plist
в ios 8 и 9.Возможные ориентации из документации Apple :
источник
Комбинация ответов Сидса и Корейса сработала для меня.
Расширение контроллера навигации:
Затем отключение поворота на одном просмотре
И вращение в соответствующую ориентацию перед началом
источник
Верхнее решение выше:
не работал для меня, когда я вызвал его в viewDidAppear представленного контроллера представления. Однако это сработало, когда я назвал его в preparForSegue в представляемом контроллере представления.
(Извините, репутации недостаточно, чтобы комментировать это решение, поэтому мне пришлось добавить его вот так)
источник
[iOS9 +] Если кто-то перетащил сюда сюда, так как ни одно из вышеперечисленных решений не сработало, и если вы представляете представление, для которого вы хотите изменить ориентацию с помощью segue, вы можете проверить это.
Проверьте тип презентации вашего segue. Мой был «в текущем контексте». Когда я изменил его в полноэкранный режим, он работал.
Благодаря @GabLeRoux я нашел это решение.
источник
Мои требования
AVPlayerViewController
для воспроизведения видеоКогда воспроизводится видео, если это пейзаж, то позволяйте экрану поворачивать пейзаж вправо и пейзаж влево. Если это портрет, тогда блокируйте вид только в портретном режиме.
Сначала определите
supportedInterfaceOrientationsForWindow
вAppDelegate.swift
Во-вторых, в вашем главном контроллере вида определите следующие функции
Затем вам нужно подкласс
AVPlayerViewController
Переопределите эти три функции в
MyPlayerViewController.swift
Поскольку пользователь может поворачивать устройство влево или вправо, нам нужно установить автоматический поворот на true
Наконец, создайте
MyPlayerViewController
экземпляр в вашем контроллере представления и установите значение размера свойства.Начните свой игрок с должным
videoUrl
, затем назначьте своего игрокаplayerViewController
. Удачного кодирования!источник
источник
Кажется, еще есть споры о том, как лучше всего выполнить эту задачу, поэтому я решил поделиться своим (рабочим) подходом. Добавьте следующий код в вашу
UIViewController
реализацию:В этом примере вам также необходимо установить для разрешенных ориентаций устройства значение «Пейзаж влево» в настройках проекта (или непосредственно в нем
info.plist
). Просто измените конкретную ориентацию, которую вы хотите использовать, если вы хотите что-то другое, чемLandscapeLeft.
Ключевым для меня был
attemptRotationToDeviceOrientation
звонокviewWillAppear
- без этого вид не вращался бы должным образом без физического вращения устройства.источник
В соответствии с ответу Корея Хинтона
Swift 2.2:
Отключить вращение
Блокировка для определенной ориентации
источник
Я попробовал несколько решений здесь, и важно понять, что именно контроллер корневого представления определяет, будет ли он вращаться или нет.
Я создал следующий проект target -c github.com/GabLeRoux/RotationLockInTabbedViewChild с рабочим примером того,
TabbedViewController
где один дочерний вид может вращаться, а другой дочерний вид заблокирован в портретной ориентации.Это не идеально, но работает, и та же идея должна работать для других видов корневых представлений, таких как
NavigationViewController
. :)источник
В соответствии с решением, представленным @ sid-sha, вы должны поместить все в
viewDidAppear:
метод, иначе вы не получитеdidRotateFromInterfaceOrientation:
уволенный, так что-то вроде:источник
Мое решение
В
AppDelegate
:XXViewController
это ViewController, который вы хотите поддерживать в ландшафтном режиме.Тогда решение Санни Шаха будет работать у вас
XXViewController
на любой версии iOS:Это служебная функция, чтобы найти самый верхний ViewController.
источник
Используйте это для блокировки ориентации контроллера вида, протестированного на IOS 9:
// Зафиксируем ориентацию вправо
источник
У меня та же проблема, и я трачу на нее столько времени. Так что теперь у меня есть свое решение. Моя настройка приложения только поддерживает портретную ориентацию. Однако некоторые экраны в моем приложении должны иметь только альбомную ориентацию. Я исправляю это с помощью переменной isShouldRotate в AppDelegate . И функция в AppDelegate :
И, наконец, когда ViewControllerA требуется ландшафтное состояние. Просто сделать это: прежде , чем толкающий / настоящее к ViewControllerA правопреемник isShouldRotate к истинному . Не забывайте, когда выдвигаете / отклоняете этот контроллер, присваивайте isShouldRotate значение false при viewWillDisappear .
источник
Для меня VC верхнего уровня необходим для реализации переопределения ориентации. Использование VC вниз по стеку не будет иметь никакого эффекта, если верхний VC не реализует.
Только VC-Main слушают, по сути, в моем тестировании.
источник
Похоже, что даже ты здесь так много ответов, никого не было достаточно для меня. Я хотел форсировать ориентацию, а затем при возвращении вернуться к ориентации устройства, но
[UIViewController attemptRotationToDeviceOrientation];
просто не сработало. Что также усложнило, так это то, что я добавил shouldAutorotate в false, основываясь на каком-то ответе, и не смог получить желаемых эффектов для правильного поворота назад во всех сценариях.Вот что я сделал:
Перед нажатием контроллера в вызове в его конструкторе инициализации это:
Поэтому я сохраняю последнюю ориентацию устройства и регистрируюсь на событие изменения ориентации. Событие изменения ориентации простое:
И при исчезновении вида я просто возвращаюсь к любой ориентации, которую я имею как userOreintation:
И это должно быть там тоже:
А также навигационный контроллер должен делегировать shouldAutorotate и supportInterfaceOrientations, но, как я полагаю, большинство людей уже имеют.
PS: Извините, я использую некоторые расширения и базовые классы, но имена довольно значимы, так что концепция понятна, сделает еще больше расширений, потому что теперь это не слишком красиво.
источник