ViewController単位で画面の向きを変えてみる
やりたいこと
1つのアプリで全ての画面において縦にするとか、縦・横両方対応するとかではなくて。
「ある画面の時には縦、ある画面の時には横と決めたい」
ということがあったので調べてみました。
実装
以下の2つのメソッドをViewControllerに用意すればOKです。
//回転処理の有無 - (BOOL)shouldAutorotate { return NO; } //サポートしている方向 - (NSUInteger)supportedInterfaceOrientations { //以下の場合は縦 return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; }
上記の例だと縦になりますが、他に以下のようなのもあります。
UIInterfaceOrientationMaskPortrait | 縦(ホームボタン下) |
UIInterfaceOrientationMaskLandscapeLeft | 横(ホームボタン左) |
UIInterfaceOrientationMaskLandscapeRight | 横(ホームボタン右) |
UIInterfaceOrientationMaskPortraitUpsideDown | 縦(ホームボタン上) |
UIInterfaceOrientationMaskLandscape | 横表示 |
UIInterfaceOrientationMaskAllButUpsideDown | 縦(ホームボタン上)以外 |
UIInterfaceOrientationMaskAll | 全方向 |
これにより各ViewControllerは設定されたOrientationで表示されるようになります。
注意点
ただ、上記で出来るのですが他との関係性が結構厄介で一度つまりました。
例えば、UINavigationControllerなどを使っていると、そこに追加しているViewControllerで上記の設定をしても効果はありません。
実際のUINavigationControllerの設定に依存するためなので、UINavigationController自身のshouldAutorotateメソッド、supportedInterfaceOrientationsメソッド自体が呼ばれた時に、追加しているViewControllerのメソッドを呼び出す必要があります。
では、UINavigationControllerをカスタマイズして上記のメソッドを以下のように呼び出せばいいって話になるのかな?となります。
- (NSUInteger)supportedInterfaceOrientations { return self.topViewController.supportedInterfaceOrientations; }
しかし!
AppDelegate.mで以下のようにしていると「この画面では横にしよう」などといったことをやるのは厳しいです。
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:svc]; [self.window setRootViewController: nc];
というのも全てUINavigationControllerに追加されているViewControllerになるためです。
というわけで、ここらへんが最初気が付かずに結構つまりました。
広告
関連記事
-
iPhone/iPadアプリを開発するためにやったこと
今までに、iPhoneを3本ほどリリース((リリースしたアプリは全て100万DL超えしました!))し
-
iPad(Retinaディスプレイモデル)にiOS7を入れてみた
iPadにiOS7を入れてみたので、その報告。 iPhone5にはまだ入れておかないでおこうと思っ
-
iPhoneアプリ開発 -UIScrollViewで画像を拡大・縮小-
* やりたいこと UIScrollViewでピンチアウト・インして上に乗っている画像を拡大・縮小した
-
github-flowを使っての開発(3) -1つのプロジェクトを複数人で開発-
今まで2回ほどgithub-flowをもとにした開発の流れを書きました。 今回は、複数人で開発をする
-
Twitterでサービスにログイン -ソーシャルログイン-
* やりたいこと -自身のWebサービスにTwitterIDでログイン(ソーシャルログイン)したい。
-
CakePHP1.3でテストコード(1) -モデルのテスト-
CakePHP1.3ではSimpleTestを用いてテストコードを書きます。 ※CakePHP2系で
-
第二回Androidテスト祭り参加記録 -祭りに参加してきたよ-
久しぶりに勉強会に参加してきました。 参加してきたのは「第二回Androidテスト祭り(4/28)
-
WordPressプラグイン「WP Hatena Notation」にPullRequestを投げた話
WordPressではてな記法が利用できる「WP Hatena Notation」を重宝しています。
-
CAPTCHAの導入方法 -KCAPTCHAの導入-
CakePHP(1.2、1.3)にKCAPTCHAを導入してみたのでメモ。 * CAPTCHA
-
研究室での進捗報告の方法について、ふと思ったこと
* 以下に加筆・修正して移動しました。