2010年3月27日土曜日

iPhoneアプリでUIImagePickerControllerによるカメラ入力の表示を回転できるのか?

UIImagePickerControllerによるカメラ入力の表示を回転できるのか?

UIImagePickerController.cameraViewTransformを使えば出来そうなんだが。やってみるさ。

- (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のプレビュー表示を90度回転してみよう
 ipc.cameraViewTransform = 
  CGAffineTransformRotate(ipc.cameraViewTransform, M_PI/2);
 
 //各種ビューをウインドウに追加
 [window addSubview:ipc.view];
 [window makeKeyAndVisible];
 
}


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



おぅおぅ。回転しておるねぇちゅうてねぇ〜


ただ、よくわからないのは回転の中心だ。ただ回転させて、そのまま上に張り付かせたような感じがある。

そこで、移動、拡大、回転を順に行ってみることにした。

- (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;
 
 //極端な位置に移動させてみよう
 ipc.cameraViewTransform = 
 CGAffineTransformTranslate(ipc.cameraViewTransform, 500, 500);

 //cameraViewのプレビュー表示を少し拡大する
 ipc.cameraViewTransform = 
  CGAffineTransformScale(ipc.cameraViewTransform, 1.3, 1.3);
  
 //cameraViewのプレビュー表示を90度回転してみよう
 ipc.cameraViewTransform = 
  CGAffineTransformRotate(ipc.cameraViewTransform, M_PI/2);


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


結果はこれだ。


どうやら、移動は全く効いていないらしい。

印象としては、移動はまず無視、縦モードの時の画像をその中心に対して拡大して、中心に対して回転、そして上に張り付かせた、という感じだ。

CGAffineTransformの使い方が間違っているのだろうか。大体どの言語でもTransformは厄介なもののひとつだ。CGAffineTransformはもっと研究する必要がある。