iPhone のカレンダーアプリは、縦向きで見た時には月間のカレンダー、横向きで見た時は週間のカレンダーで表示されます。この様に、デバイスの向きによってインターフェイスを切り替えるには、縦向きと横向きのインターフェイスを別々の View Controller を用意します。
プロパティ
縦向きの View Controller に、横向きであるかどうかを保存するプロパティ (isLandscapeViewController
) を作ります。初期値は false です。
var isLandscapeViewController: BOOL = false
回転コード
デバイスが回転されると、画面サイズが変わるので
viewWillTransitionToSize:withTransitionCoordinator
が呼ばれます。そこで、幅が高さを比較して画面遷移をします。
ここでは、横向きの View Controller の Storyboard ID をLandscapeViewController
とします。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if size.width < size.height && self.isLandscapeViewController {
self.dismissViewControllerAnimated(true, completion: nil)
self.isLandscapeViewController = false
} else if size.width > size.height && !self.isLandscapeViewController {
landscapeViewController = self.storyboard.instantiateViewControllerWithIdentifier("WeeklyViewController")
self.presentViewController(landscapeViewController, animated:true completion: nil)
self.isLandscapeViewController = true
}
}
別のインターフェイスからの遷移
viewWillTransitionToSize:withTransitionCoordinator
で回転には対応できましたが、別のインターフェイスで向きを変えた後にこのインターフェイスが表示された場合、viewWillTransitionToSize:withTransitionCoordinator
が呼ばれないため、画面が横向きであっても縦向きの View Controller が表示されてしまいます。
そこで、viewDidApear:animated
で viewWillTransitionToSize:withTransitionCoordinator
を呼び出します。そのとき、引数 size
には画面サイズ (UIScreen.mainScreen().bounds.size
) を渡します。
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.viewWillTransitionToSize(UIScreen.mainScreen().bounds.size, nil)
}
回転に応じて変更する場所が少ない場合は、各変更要素をコントロールした方が管理が楽になりますが、全く異なるインターフェイスになる場合は別の View Controller を用意してしまった方が管理が楽になると思います。