IOS. Как включить и отключить вращение на каждом UIViewController?

У меня есть UIViewController, я хочу отключить или включить вращение экрана в разных сценариях

Пример:

if flag {
   rotateDevice = false
}
else {
   rotateDevice = true
}

Как я могу это сделать?

Ответ 1

У меня есть ответ. В AppDelegate, если вы поворачиваете устройство, нажимаете viewcontroller и т.д. Эта функция всегда вызывает

Обновление для Swift 3/4

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask
{
    return self.restrictRotation
}

self.restrictRotation - это пользовательский параметр.

Как пользоваться:

В Appdelegate:

 var restrictRotation:UIInterfaceOrientationMask = .portrait

В ViewController:

Когда вызывается метод ViewDidLoad или viewWillAppear. Мы изменимся так:

(UIApplication.shared.delegate as! AppDelegate).restrictRotation = .all 

и тогда этот метод на AppDelegate будет вызван.

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask

Ответ 2

Вы просто должны реализовать shouldAutorotate и supportedInterfaceOrientations в свой UIViewController. Посмотрите на эту документацию. Например:

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

Вы также можете указать, какие ориентации доступны. Вот пример только с ориентацией портретов:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return .Landscape
}

Редактировать: Если вы хотите поддерживать различную ориентацию относительно флага, вам просто нужно сделать что-то вроде этого:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    if myFlag {
        return .Landscape
    } else {
        return .All
    }
}

(Если myFlag верно, это позволит Landscape ориентации. В противном случае, это позволит всем ориентациям).

Ответ 3

Свифт 4

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    get {
        return .portrait

    }
}

Ответ 4

В swift 5, как и в предыдущем случае, если вы хотите разрешить (избегать других) вращение определенного UIViewController в определенной ориентации, вы должны переопределить "supportInterfaceOrientations" внутри вашего класса UIViewController следующим образом:

class MyViewController:UIViewController{
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
        get{
            return .portrait
        }
    }
}

Здесь есть возможные варианты:

public struct UIInterfaceOrientationMask : OptionSet {

    public init(rawValue: UInt)


    public static var portrait: UIInterfaceOrientationMask { get }

    public static var landscapeLeft: UIInterfaceOrientationMask { get }

    public static var landscapeRight: UIInterfaceOrientationMask { get }

    public static var portraitUpsideDown: UIInterfaceOrientationMask { get }

    public static var landscape: UIInterfaceOrientationMask { get }

    public static var all: UIInterfaceOrientationMask { get }

    public static var allButUpsideDown: UIInterfaceOrientationMask { get }
}

расширенный

Если вы хотите различать iPad или iPhone, вы можете использовать UIUserInterfaceIdiom:

override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
    get{
        return UIDevice.current.userInterfaceIdiom == .phone ? [.portrait, . portraitUpsideDown]:.all //OBS -> You can also return an array
    }
}

где:

public enum UIUserInterfaceIdiom : Int {


    case unspecified

    @available(iOS 3.2, *)
    case phone // iPhone and iPod touch style UI

    @available(iOS 3.2, *)
    case pad // iPad style UI

    @available(iOS 9.0, *)
    case tv // Apple TV style UI

    @available(iOS 9.0, *)
    case carPlay // CarPlay style UI
}

Ответ 5

установить ориентацию устройства в Target → General → Deployment Info → Portrait

enter image description here