UIViewControllerがあり、さまざまなシナリオで画面の回転を無効または有効にしたい
例:
if flag {
rotateDevice = false
}
else {
rotateDevice = true
}
どうやってやるの?
答えがあります。 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
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
がtrueの場合、Landscape
の向きを許可します。それ以外の場合、すべての向きを許可します)。
スイフト4
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
get {
return .portrait
}
}
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
}