Ориентация задающего устройства в iOS Swift

Я работаю над быстрым приложением для iPhone. Существует модальное представление в моем приложении, что я хочу только быть в представлении портрета.

Мой вопрос, как я программно вынуждаю телефон не позволить вращение? Другими словами, я ищу код, который не позволит модальному представлению быть отображенным в альбомном режиме (включающий блокировку вращения портрета).

Это только для 1 модального представления, таким образом, я не могу выключить вращение для целого приложения, иначе я просто отключил бы вращение в целом.

Я нашел код в своем исследовании здесь, Но это находится в цели C, в случае, если это помогает.Спасибо!

62
задан 23 May 2017 в 13:31

17 ответов

Можно вставить эти методы в ViewController каждого представления, которое должно быть портретом:

override func shouldAutorotate() -> Bool {
    return false
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.Portrait
}
50
ответ дан 31 October 2019 в 13:06

Swift 4:

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

extension myViewController {
    //manage rotation for this viewcontroller
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
}

Eezy-peezy.

0
ответ дан 31 October 2019 в 13:06

От iOS 10.0 нам нужно set { self.orientations = newValue } для установки ориентации, Удостоверьтесь, что альбомное свойство включено в Вашем проекте.

private var orientations = UIInterfaceOrientationMask.landscapeLeft
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
    get { return self.orientations }
    set { self.orientations = newValue }
}
0
ответ дан 31 October 2019 в 13:06

Мой скромный вклад (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/

0
ответ дан 31 October 2019 в 13:06

Быстро 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;
    }
}
0
ответ дан 31 October 2019 в 13:06

Два предложения с решением @Vivek Parihar:

  1. , Если мы представляем какой-либо 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()
    }
    }
    
  2. , Если Мы будем использовать какой-либо лист действия для представления, и пользователь повернет 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)
    }
    
2
ответ дан 31 October 2019 в 13:06

//Swift 2

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    let orientation: UIInterfaceOrientationMask =
    [UIInterfaceOrientationMask.Portrait, UIInterfaceOrientationMask.PortraitUpsideDown]
    return orientation
}
3
ответ дан 31 October 2019 в 13:06

Я изо всех сил пытался все утро получить ТОЛЬКО среду, слева/справа поддерживаемую правильно. Я обнаружил что-то действительно раздражающее; хотя вкладка "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 и кода является единственным способом, которым я смог получить его работающий правильно.

4
ответ дан 31 October 2019 в 13:06

Более как будто Быстрая версия:

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()
    }
}
4
ответ дан 31 October 2019 в 13:06

enter image description here

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()
    }
9
ответ дан 31 October 2019 в 13:06

Для Быстрых 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.

8
ответ дан 31 October 2019 в 13:06

Если кто-то хочет ответ, я думаю, что просто получил его. Попробуйте это:

  • Переходят к Вашему .plist файлу и проверяют все ориентации.
  • В контроллере представления Вы хотите вызвать ориентацию, добавить следующий код:
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!

11
ответ дан 31 October 2019 в 13:06

Это отключит авторотацию представления:

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;
    }
}

, Если приложение находится в альбомном режиме и Вы показываете представление, которое должно быть, показал в режиме портрета, это позволит приложению изменяться, это - ориентация к портрету (конечно, когда устройство будет повернуто к такой ориентации).

11
ответ дан 31 October 2019 в 13:06

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

Мы можем поддерживать и блокирующий к текущей ориентации и самовращающийся для соединения определенной ориентации с этим универсальным расширением на 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, которой он помогает. Спасибо

18
ответ дан 31 October 2019 в 13:06

вращение 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
    }
}}
40
ответ дан 31 October 2019 в 13:06

Привет для LandscapeLeft и LandscapeRight (Обновление Быстро 2.0)

enter image description here И у Вас есть это в информации

enter image description here

И UIController

override func shouldAutorotate() -> Bool {
    return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return [UIInterfaceOrientationMask.LandscapeLeft,UIInterfaceOrientationMask.LandscapeRight]
}

Для использования PortraitUpsideDown и Портрета что enter image description here

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())!
    }
}
69
ответ дан 31 October 2019 в 13:06

В info.plist файле измените ориентации, которые Вы хотите в "поддерживаемой интерфейсной ориентации".

быстро способом вспомогательные файлы-> info.plist-> поддерживающий интерфейсную ориентацию.

6
ответ дан 31 October 2019 в 13:06

Другие вопросы по тегам:

Похожие вопросы: