iPhone用のアプリだと、ポートレート表示にのみ対応したアプリを作ることはまあ多いことだろうと思います。この場合に困るのは、UIWebViewでWebページを表示した場合に、その中にある動画もポートレートでしか再生できないことです。
「動画が横長なのに画面が回転できないなんて!星ひとつ!!」と言われたことはありませんが、不便に感じるのでできるだけ解消してあげたいところです。
UIWebViewの画面だけでも回転対応すればいいやんとか言われそうですが、まあ…なかなかそうもいかないのが社会のツラさです。
3行でわかる対応方法
単純な話なので結論を先に書きます。
- Info.plistのUISupportedInterfaceOrientationsで全画面回転対応しておく
- 各ViewControllerでshouldAutorotateの戻り値をNoにしたりとか回転を抑制する
- 申請する
わかってると5分でアップデート申請できます。具体的なやり方については、以下をご覧ください。
Info.plistの全画面回転対応
XcodeのビルドターゲットのGeneralってところにDevice Orientationsってのがあるので、Landscapeにチェックを入れます。これであなたのアプリはランドスケープ表示に対応するようになりました!
このまま動作して何の問題もないなら、それで解決みんなハッピーなんですけどね…。
各ViewControllerで回転を抑制
各地のViewControllerに以下のメソッドを実装して、デバイスを回転させても画面が回転しないようにします。
- (BOOL) shouldAutorotate {
return NO;
}
- (NSUInteger) supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
UITabBarControllerとかUINavigationControllerなどのコンテナのViewControllerを使っている場合は、そちらで実装しておく必要があります。たとえばUITabBarControllerに実装しておけば、その中のViewControllerには実装しなくていいので楽です。ただしmodalなどを呼び出す場合はmodalのViewControllerにも実装しておく必要があります。
まあ普通にUITabBarControllerとUINavigationControllerを継承したクラスを作ってそちらで実装しておけば、ほとんど大丈夫じゃないでしょうか。(カテゴリを使ってもできますが、オリジナルのメソッドを変更するようなカテゴリはあんまり良くないと思います。)
今回の目的と外れますが、もし表示されているViewController毎に回転するかしないかを決めたいような場合は、UITabBarControllerの子供のViewControllersの戻り値を見るような処理にしないといけないです。Qiitaの記事があったので、興味があればご参照ください。
以上で対応は完了です。
この状態で動画を再生すると、ランドスケープで全画面表示できるようになるので「超ベンリです!星5個です!」とか言ってもらえるかもしれません。