※ハマったため、自分用メモになります。
目的
全体の数画面のうち、一画面のみ画面回転時に固定にしたい。
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を利用すると便利。