ViewController単位で画面の向きを変えてみる

公開日: : iPhone, IT, Mac


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にはまだ入れておかないでおこうと思っ

記事を読む

no image

iPhoneアプリ開発 -UIScrollViewで画像を拡大・縮小-

* やりたいこと UIScrollViewでピンチアウト・インして上に乗っている画像を拡大・縮小した

記事を読む

no image

github-flowを使っての開発(3) -1つのプロジェクトを複数人で開発-

今まで2回ほどgithub-flowをもとにした開発の流れを書きました。 今回は、複数人で開発をする

記事を読む

no image

Twitterでサービスにログイン -ソーシャルログイン-

* やりたいこと -自身のWebサービスにTwitterIDでログイン(ソーシャルログイン)したい。

記事を読む

no image

CakePHP1.3でテストコード(1) -モデルのテスト-

CakePHP1.3ではSimpleTestを用いてテストコードを書きます。 ※CakePHP2系で

記事を読む

no image

第二回Androidテスト祭り参加記録 -祭りに参加してきたよ-

久しぶりに勉強会に参加してきました。 参加してきたのは「第二回Androidテスト祭り(4/28)

記事を読む

WordPressプラグイン「WP Hatena Notation」にPullRequestを投げた話

WordPressではてな記法が利用できる「WP Hatena Notation」を重宝しています。

記事を読む

no image

CAPTCHAの導入方法 -KCAPTCHAの導入-

CakePHP(1.2、1.3)にKCAPTCHAを導入してみたのでメモ。 * CAPTCHA

記事を読む

no image

研究室での進捗報告の方法について、ふと思ったこと

* 以下に加筆・修正して移動しました。

記事を読む

広告

Message

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

広告

no image
[感想] Effective Objective-C 2.0 ☆☆☆☆★(4.5)

* 構成 - 第1章 Objective-Cに慣れる -

no image
[感想] iOSアプリテスト自動化入門 ☆☆☆(3.0)

* 構成 - Chapter 1 テスト自動化への取り組み

DeployGateを試してみた(iOS編) -DeployGateがiOSに対応-

今までのDeployGate - -[http://pplace.

iPhone/iPadアプリを開発するためにやったこと

今までに、iPhoneを3本ほどリリース((リリースしたアプリは全て1

no image
ターミナルでgitのコマンドを補完したりブランチ名を表示する – macでgitを便利に使うために –

* やりたいこと macのターミナルでgitをいじっていると -今の

→もっと見る

PAGE TOP ↑