Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

目的

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

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を利用すると便利。

yu_okb
アスリート並の身体能力を持つiOSエンジニア。アスリート指数は77です。定時後はジムにしか行きません。
https://itunes.apple.com/jp/developer/ohkubo-yuhei/id1003046002?mt=8&ign-mpt=uo%3D2
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away