web-dev-qa-db-ja.com

iOS。各UIViewControllerで回転を有効または無効にする方法は?

UIViewControllerがあり、さまざまなシナリオで画面の回転を無効または有効にしたい

例:

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

どうやってやるの?

22
Bao Tuan Diep

答えがあります。 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
40
Bao Tuan Diep

shouldAutorotatesupportedInterfaceOrientationsUIViewControllerに実装するだけです。 このドキュメント をご覧ください。例えば:

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

使用可能な方向を指定することもできます。以下は、縦向きのみの例です。

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

編集:フラグに関して異なる方向をサポートする場合は、次のようにするだけです。

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

myFlagがtrueの場合、Landscapeの向きを許可します。それ以外の場合、すべての向きを許可します)。

22
Julien Quere

スイフト4

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    get {
        return .portrait

    }
}
13
Baryon Lee

Swift 5、前と同じように、特定のUIViewControllerを特定の方向に回転させる(他を避ける)場合は、UIViewControllerクラス内の "supportedInterfaceOrientations"を次のようにオーバーライドする必要があります。

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
}
4
Reimond Hill