LoginSignup
5
4

More than 5 years have passed since last update.

【Swift2.0】特定の画面のみ画面回転を固定にしたい

Last updated at Posted at 2015-11-23

※ハマったため、自分用メモになります。

目的

全体の数画面のうち、一画面のみ画面回転時に固定にしたい。

UIViewController.swiftに記述することで個別に画面回転をさせたい。

前提

  • UINavigationControllerが有効になっていること
  • storyboardを使用してViewを構成していること

手段

UINavigationControllerの拡張クラスを作り、shouldAutorotate()を定義する。
AppDelegate内で特定のUIViewControllerに対してセットする。拡張先のshouldAutorotate()の返り値は常にfalseに設定する。

理由

  • XCode > PROJECT > infoタブ > Device Orientation

のチェックボックスを設定した場合、すべての画面にPortraitやLandspaceなどの設定が影響してしまう。
このチェックボックスをすべて外し、画面回転を許可した上で個別にコードでセットすることで、特定の画面のみ画面回転するようにできるため。

ソース

AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
        let mainViewController: UIViewController = storyboard.instantiateInitialViewController()!
        if (isDeviceIPhone == true) {
            self.window?.rootViewController = mainViewController
            self.navigationController = UINavigationController(rootViewController: mainViewController)

            // UINavigationControllerの拡張関数を呼び出す
            self.navigationController?.shouldAutorotate()
        } else {
            self.window?.rootViewController = ViewControllerForiPad()
            self.navigationController = UINavigationController(rootViewController: mainViewControllerForIPad)
        }

        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()
        return true
    }
}
ViewController.swift
extension UINavigationController {
    public override func shouldAutorotate() -> Bool {
        // 画面回転をするかしないかをBool値で返す
        // この場合回転させないため、falseをリターンする
        return false
    }
}

追記

UIViewConteoller単位に記述する方法

ViewController.swift
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        let navi:UINavigationController = UINavigationController()
        navi.shouldAutorotate()
    }

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

※ここではデバイス判定のコードは割愛
※iPhone、iPadで処理を分け、iPhoneのみ画面回転をさせたくないケース

備考

UINavigationControllerが有効になっている場合は、UINavigationControllerのデバイス回転を拒否してあげる必要がある。その際にextensionを利用すると便利。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4