Photos(写真)アプリに使われている、全画面ビューを真似して作ってみました。具体的には以下のような仕様になります。
- ステータスバーの後ろも含め、ビューの内容が全画面(320x480)で表示される
- 画面をタップするとステータスバーとナビゲーションバーが消える
- もう一度タップすると再度表示される
- iPhoneを傾けると画面が回転する
http://life.ponpoko.tv/?p=533
また、サンプルソースも公開してます。こちらのソースの、
- (void)fullScreenMode:(BOOL)mode animated:(BOOL)animated
がフルスクリーン表示を実現しているメソッドになります。■注意
iPhone OS 3.0以上専用です。2.2以下では別の方法を取る必要があります。
■まずはStatus BarとNavigation Barを消す
http://life.ponpoko.tv/?p=533 こちらのページに書いてある内容を100%そのまま
ただし一点、
[self.navigationController setNavigationBarHidden:YES animated:YES];
を使うと、ナビゲーションバーが上方向に対してぴょこんと引っ込むようなアニメーションになります。ステータスバーはその場でフェードアウトして消えるので、なんだか不自然な感じに見えます。Photos.app(写真アプリ)など、iPhone標準のアプリと同様にナビゲーションバーをフェードアウトさせて消したい場合には、UIViewのアニメーション機能とalpha値を利用して以下のようにします。if (animated)(Three20プロジェクトのソースから拝借してきました><)
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
}
self.navigationController.navigationBar.alpha = mode ? 0 : 1;
if (animated)
{
[UIView commitAnimations];
}
■Viewを全画面配置する(Status BarとNavigation Barのあった場所にも描画させたい)
さんざん悩んだあげく、実はUIViewControllerにそのためのプロパティがあったと知り、ものすごく簡単に解決しました。
- (void)viewWillAppear:(BOOL)animatedついでにステータスバーとナビゲーションバーを透明にして裏が透過するようにしてみました。
{
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
// このUIViewController.wantsFullScreenLayoutをYESにするとフルスクリーン表示になる
self.wantsFullScreenLayout = YES;
}
■ビューの回転に対応したい
何も考えずにshouldAutorotateToInterfaceOrientationすればいいだろう常考
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientationとおもったら思わぬ落とし穴が。確かに全画面表示にした状態でビューを回転させたり、逆にナビゲーションバーが出ている状態でビューを回転させたりする分にはこれだけで全く問題ないのですが、
{
return YES;
}
- ナビゲーションバーを消す(全画面表示にする)
- iPhoneを傾けてビューを回転させる
- 再度ナビゲーションバーを表示する
// Force set the frame of the navigation bar
CGRect frame = self.navigationController.navigationBar.frame;
frame.origin.y = 20.0;
self.navigationController.navigationBar.frame = frame;
■全画面表示をしている画面から前の画面に戻るとバグる問題
これで完成かと思えば、最後にもう一つ落とし穴が。
- iPhoneを横向きに傾けて、Landscape表示にする
- ナビゲーションバーを表示する
- そのまま横向きになっている状態で、ナビゲーションバーの戻るボタンを押して、前の画面に戻る
- 前の画面に戻る際に、wantsFullScreenLayoutをNOにして通常画面モードにし、ステータスバーとナビゲーションバーのスタイルもDefaultに戻す
いろいろ試してみた結果、全画面表示をしている画面ではなく、前の画面のviewWillAppearのタイミングで以下のコードを呼びだせば問題が解決しました。
- (void)viewWillAppear:(BOOL)animated
{
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
}