2010年3月27日土曜日

iPhoneアプリでUIImagePickerControllerを表示するとステータスバーが出ない&下に隙間が空くのを何とかするには?

UIImagePickerControllerを表示すると2つ問題がある事に気づいた。このようにステータスバーが出ないことと、下に隙間が空くことだ。(たぶんツールバー分)


さっき書いた記事でもお世話になったが、ここでもまた「btobits Blog」の記事が参考になる。
btobits Blog >> Camera as background using UIImagePickerController

ステータスバーが出ないのは、単にステータスバーがUIImagePickerControllerの表示の下に隠れているだけらしい。そこでこうする。

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    
 NSLog(@"applicationDidFinishLaunching()");
 
 //ImagePickerControllerの作成と基本設定
 UIImagePickerController *ipc = [[[UIImagePickerController alloc] init] autorelease];
 ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
 ipc.showsCameraControls = NO;
    
 //ステータスバーが見えるようにステータスバーの高さ(20px)分だけ下に移動させる
 //高さを-20させるところがポイント。これをしないとステータスバーは表示されない
 //ただ、高さを-20させても高さは変わっていない。高さの調整はまったく効いていないようだ
 CGRect frameIPC = ipc.view.frame;
 frameIPC.origin.y += 20;
 frameIPC.size.height -= 20;
 ipc.view.frame = frameIPC;
 
 [window addSubview:ipc.view];
 [window makeKeyAndVisible];
 
}


するとこうなる。ひとまずYeah!


しかし、まだ下の方に隙間が空いているのがわかる。ipc.view.heightを調整できればいいのだが、これができない。試しに+100と-100をしてみたが、どちらも全く変化がない。

そこで仕方ないので、UIImagePickerController.cameraViewTransformを使ってカメラの入力を少しだけ拡大することにした。リサイズではなく、あくまでスケールなので、あまり拡大しすぎると画質が劣化する恐れがある。試したところ、まぁ1.1倍くらいにすれば下の隙間がなくなることがわかった。

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    
 NSLog(@"applicationDidFinishLaunching()");
 
 //ImagePickerControllerの作成と基本設定
 UIImagePickerController *ipc = [[[UIImagePickerController alloc] init] autorelease];
 ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
 ipc.showsCameraControls = NO;
    
 //ステータスバーが見えるようにステータスバーの高さ(20px)分だけ下に移動させる
 //高さを-20させるところがポイント。これをしないとステータスバーは表示されない
 //ただ、高さを-20させても高さは変わっていない。高さの調整はまったく効いていないようだ
 CGRect frameIPC = ipc.view.frame;
 frameIPC.origin.y += 20;
 frameIPC.size.height -= 20;
 ipc.view.frame = frameIPC;
 
 //ステータスバー分だけ下げてもまだ下の方に隙間ができるので
 //cameraViewのプレビュー表示を拡大して隙間を無くす
 ipc.cameraViewTransform = 
  CGAffineTransformScale(ipc.cameraViewTransform, 1.1, 1.1);

 //各種ビューをウインドウに追加
 [window addSubview:ipc.view];
 [window makeKeyAndVisible];
 
}


CGAffineTransformScale()を使うにはCoreGraphics.frameworkのリンクが必要である事に注意。
琴線探査: iPhoneアプリで縦画面を横にした時に左上を基準に縦画面をフィットさせて表示するには?

するとこうなる。This is it!



いやはや。これでデバイスの回転が加わると、デバイスの向きによって上下左右に移動させるなど、よりヤヤコシイことになるだろう。

だからUIViewControllerのサブビューに追加したかったのに・・・できないんだもんなぁ〜(^^);