Я работаю над быстрым приложением для iPhone. Существует модальное представление в моем приложении, что я хочу только быть в представлении портрета.
Мой вопрос, как я программно вынуждаю телефон не позволить вращение? Другими словами, я ищу код, который не позволит модальному представлению быть отображенным в альбомном режиме (включающий блокировку вращения портрета).
Это только для 1 модального представления, таким образом, я не могу выключить вращение для целого приложения, иначе я просто отключил бы вращение в целом.
Я нашел код в своем исследовании здесь, Но это находится в цели C, в случае, если это помогает.Спасибо!
Можно вставить эти методы в ViewController каждого представления, которое должно быть портретом:
override func shouldAutorotate() -> Bool {
return false
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
Swift 4:
самый простой ответ, в моем случае, бывшем должном гарантировать одно onboarding учебное представление, был только для портрета:
extension myViewController {
//manage rotation for this viewcontroller
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
}
Eezy-peezy.
От iOS 10.0 нам нужно set { self.orientations = newValue }
для установки ориентации, Удостоверьтесь, что альбомное свойство включено в Вашем проекте.
private var orientations = UIInterfaceOrientationMask.landscapeLeft
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
get { return self.orientations }
set { self.orientations = newValue }
}
Мой скромный вклад (Xcode 8, Swift 3):
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if let rootViewController = self.topViewControllerWithRootViewController(rootViewController: window?.rootViewController) {
if (rootViewController.responds(to: Selector(("canRotate")))) {
// Unlock landscape view orientations for this view controller
return .allButUpsideDown;
}
}
return .portrait;
}
private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
if (rootViewController == nil) { return nil }
if (rootViewController.isKind(of: (UITabBarController).self)) {
return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
} else if (rootViewController.isKind(of:(UINavigationController).self)) {
return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
} else if (rootViewController.presentedViewController != nil) {
return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
}
return rootViewController
}
... на AppDelegate. Все кредиты на Gandhi Mena: http://www.jairobjunior.com/blog/2016/03/05/how-to-rotate-only-one-view-controller-to-landscape-in-ios-slash-swift/
Быстро 2.2
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
if self.window?.rootViewController?.presentedViewController is SignatureLandscapeViewController {
let secondController = self.window!.rootViewController!.presentedViewController as! SignatureLandscapeViewController
if secondController.isPresented {
return UIInterfaceOrientationMask.LandscapeLeft;
} else {
return UIInterfaceOrientationMask.Portrait;
}
} else {
return UIInterfaceOrientationMask.Portrait;
}
}
Два предложения с решением @Vivek Parihar:
, Если мы представляем какой-либо viewController, мы должны проверить ноль на “visibleViewController” в navigationController расширении
extension UINavigationController {
public override func shouldAutorotate() -> Bool {
var shouldAutorotate = false
if visibleViewController != nil {
shouldAutorotate = visibleViewController.shouldAutorotate()
}
return shouldAutorotate
}
public override func supportedInterfaceOrientations() -> Int {
return visibleViewController.supportedInterfaceOrientations()
}
}
, Если Мы будем использовать какой-либо лист действия для представления, и пользователь повернет upsideDown, то лист действия откроется от верхнего края экрана :P, для решения этого, мы должны взять Портрет только
override func shouldAutorotate() -> Bool {
if (UIDevice.currentDevice().orientation == UIDeviceOrientation.Portrait ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) {
return true
}
else {
return false
}
}
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
//Swift 2
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
let orientation: UIInterfaceOrientationMask =
[UIInterfaceOrientationMask.Portrait, UIInterfaceOrientationMask.PortraitUpsideDown]
return orientation
}
Я изо всех сил пытался все утро получить ТОЛЬКО среду, слева/справа поддерживаемую правильно. Я обнаружил что-то действительно раздражающее; хотя вкладка "General" позволяет Вам отменять выбор "Портрета" для ориентации устройства, необходимо отредактировать сам plist для отключения ориентаций ИНТЕРФЕЙСА Портрета и PortraitUpsideDown - это - последний ключ в plist: "Поддерживаемые Интерфейсные Ориентации".
другая вещь состоит в том, что кажется, что необходимо использовать версии "маски" перечислений (например, UIInterfaceOrientationMask. LandscapeLeft), не только ориентация один. Код, который получил его работающий на меня (в моем основном viewController):
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.LandscapeLeft.rawValue) | Int(UIInterfaceOrientationMask.LandscapeRight.rawValue)
}
Создание этой комбинации изменений plist и кода является единственным способом, которым я смог получить его работающий правильно.
Более как будто Быстрая версия:
override func shouldAutorotate() -> Bool {
switch UIDevice.currentDevice().orientation {
case .Portrait, .PortraitUpsideDown, .Unknown:
return true
default:
return false
}
}
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue) | Int(UIInterfaceOrientationMask.PortraitUpsideDown.rawValue)
}
UINavigationController
от Vivek Parihar
extension UINavigationController {
public override func shouldAutorotate() -> Bool {
return visibleViewController.shouldAutorotate()
}
}
Go to your pList and add or remove the following as per your requirement:
"Supported Interface Orientations" - Array
"Portrait (bottom home button)" - String
"Portrait (top home button)" - String
"Supported Interface Orientations (iPad)" - Array
"Portrait (bottom home button)" - String
"Portrait (top home button)" - String
"Landscape (left home button)" - String
"Landscape (right home button)" - String
Примечание: Этот метод позволяет вращение для целого приложения.
ИЛИ
Делают ParentViewController для UIViewControllers в проекте (Метод Наследования).
// UIappViewController.swift
import UIKit
class UIappViewController: UIViewController {
super.viewDidLoad()
}
//Making methods to lock Device orientation.
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
override func shouldAutorotate() -> Bool {
return false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Партнер родительский контроллер контроллера каждого представления как UIappViewController.
// LoginViewController.swift
import UIKit
import Foundation
class LoginViewController: UIappViewController{
override func viewDidLoad()
{
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
Для Быстрых 3 iOS 10
override open var shouldAutorotate: Bool {
return false
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return .portrait
}
Однако существует ошибка с установкой shouldAutorotate
, в настоящее время не работает над iOS 9.
Если кто-то хочет ответ, я думаю, что просто получил его. Попробуйте это:
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait.toRaw().hashValue | UIInterfaceOrientationMask.PortraitUpsideDown.toRaw().hashValue
}
Hope это помогает!
РЕДАКТИРОВАНИЕ:
Для принуждения вращения используйте следующий код:
let value = UIInterfaceOrientation.LandscapeRight.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")
Это работает на iOS 7 & 8!
Это отключит авторотацию представления:
override func shouldAutorotate() -> Bool {
return false;
}
Обновление
override func shouldAutorotate() -> Bool {
if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) {
return false;
}
else {
return true;
}
}
, Если приложение находится в альбомном режиме и Вы показываете представление, которое должно быть, показал в режиме портрета, это позволит приложению изменяться, это - ориентация к портрету (конечно, когда устройство будет повернуто к такой ориентации).
Выше кода не мог бы работать из-за возможности, если Ваш контроллер представления принадлежит контроллеру навигации. Если да затем это должно соблюсти правила контроллера навигации, даже если это имеет другую ориентацию, управляет себя. Лучший подход должен был бы позволить контроллеру представления решить для себя, и контроллер навигации будет использовать решение о самом верхнем контроллере представления.
Мы можем поддерживать и блокирующий к текущей ориентации и самовращающийся для соединения определенной ориентации с этим универсальным расширением на UINavigationController:-:
extension UINavigationController {
public override func shouldAutorotate() -> Bool {
return visibleViewController.shouldAutorotate()
}
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return (visibleViewController?.supportedInterfaceOrientations())!
}
}
Теперь в Вашем контроллере представления мы можем
class ViewController: UIViewController {
// MARK: Autoroate configuration
override func shouldAutorotate() -> Bool {
if (UIDevice.currentDevice().orientation == UIDeviceOrientation.Portrait ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.PortraitUpsideDown ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) {
return true
}
else {
return false
}
}
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue) | Int(UIInterfaceOrientationMask.PortraitUpsideDown.rawValue)
}
}
Hope, которой он помогает. Спасибо
вращение Swift 3
Ориентации более сложно, если контроллер представления встраивается в UINavigationController или UITabBarController, контроллер панели навигации или панели вкладок имеет приоритет и принимает решения об авторотации и поддерживаемых ориентациях.
Использование следующие расширения на UINavigationController и UITabBarController так, чтобы контроллеры представления, которые встраиваются в один из этих контроллеров, добрались для принятия решений:
расширение UINavigationController
extension UINavigationController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = visibleViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = visibleViewController {
return visibleVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
if let visibleVC = visibleViewController {
return visibleVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}}
расширение UITabBarController
extension UITabBarController {
override open var shouldAutorotate: Bool {
get {
if let selectedVC = selectedViewController{
return selectedVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let selectedVC = selectedViewController{
return selectedVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
if let selectedVC = selectedViewController{
return selectedVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}}
Теперь можно переопределить supportedInterfaceOrientations, shouldAutoRotate и preferredInterfaceOrientationForPresentation в контроллере представления, который Вы хотите заблокировать вниз иначе, можно не учесть переопределения в других контроллерах представления, что Вы хотите наследовать поведение ориентации по умолчанию, указанное в plist Вашего приложения.
Блокировка к Определенной Ориентации
class YourViewController: UIViewController {
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
return .portrait
}
}}
Отключают Вращение
class YourViewController: UIViewController {
open override var shouldAutorotate: Bool {
get {
return false
}
}}
Изменение Предпочтительная Интерфейсная Ориентация Для Презентации
class YourViewController: UIViewController {
open override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
return .portrait
}
}}
Привет для LandscapeLeft и LandscapeRight (Обновление Быстро 2.0)
И у Вас есть это в информации
И UIController
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.LandscapeLeft,UIInterfaceOrientationMask.LandscapeRight]
}
Для использования PortraitUpsideDown и Портрета что
override func shouldAutorotate() -> Bool {
if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) {
return false
}
else {
return true
}
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.Portrait ,UIInterfaceOrientationMask.PortraitUpsideDown]
}
сообщение из Франции С Рождеством!
Редактирование:
Другое решение:
extension UINavigationController {
public override func shouldAutorotate() -> Bool {
if visibleViewController is MyViewController {
return true // rotation
} else {
return false // no rotation
}
}
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return (visibleViewController?.supportedInterfaceOrientations())!
}
}
В info.plist файле измените ориентации, которые Вы хотите в "поддерживаемой интерфейсной ориентации".
быстро способом вспомогательные файлы-> info.plist-> поддерживающий интерфейсную ориентацию.