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になるためです。
というわけで、ここらへんが最初気が付かずに結構つまりました。

広告

関連記事

Jenkins + スマホアプリ(1) -スマホアプリ用CI環境を作ってみよう-

前回までは、iPhoneアプリでのCI環境でした。 TestFlightがAndroidアプリにも

記事を読む

no image

iPhoneアプリ開発 -同じ画像を2度以上画像処理した際に起こるエラーの対処-

* 起きた現象 (1) UIImageのデータを元にピクセルの値を色々といじって画像処理。 (2)

記事を読む

no image

iPhoneアプリをヒットさせるために大事な5つのこと

巷にはたくさんのiPhoneアプリがたくさんあります。 そして、毎日新しいアプリがリリースされていま

記事を読む

no image

iPhoneアプリ開発 -UIButtonのTouch Down、Touch up Inside、Touch up Outsideの使い方-

* Touch DownとTouch up Inside、Touch up Outsideの違い

記事を読む

no image

CakePHP1.3にSmartyを導入

いい加減、CakePHP(1.3)にもSmartyを導入することにしました。 * ダウンロード

記事を読む

no image

Selenium2.0でUIテスト(2) -Rubyでやってみよう-

前回は、Selenium + PHPを試しました。 今後はRubyでやってみようということでSele

記事を読む

iPhoneアプリ開発 芳名帳アプリ作成(1) -最初の一歩-

* 作るアプリ 結婚式や2次会で「自分の名前を書く」芳名帳 これをアプリで作ってみます。

記事を読む

Jenkins + DeployGate(2) -DeployGateにアプリをアップ!-

DeployGateを使ってますか? 継続的にDeployってますか? TestFlightの

記事を読む

mixisample

iPhoneアプリ開発 -mixiSDKを使ってmixi連携をしてみる(1)-

* やりたいこと iPhoneアプリでmixiと連携し、mixiボイスなどに文字を投稿する。 ※

記事を読む

no image

アプリのためにFacebookページ作成 -現時点で注意すべき点-

* 前回 会社のメルアドでFacebookページを作成する方法を載せました。 * Faceboo

記事を読む

広告

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 ↑