デバイスの向きでインターフェイスを切り替える

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 を用意してしまった方が管理が楽になると思います。

作成者: コネタねこ

上から読んでも『コネタねこ』、下から読んでも『コネタねこ』。贈り物に悩んだら、コネタねこの小ネタ帳。欲しくなっちゃうプレゼント、そんなアイデアのぞきにきてね♪

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です