アイリスシャッターを表示させないようにする

UIImagePickerControllerのsourceTypeをUIImagePickerControllerSourceTypeCameraに設定して、presentModalViewControllerで表示させた後、アイリスシャッターを表示させないようにするにはどうしたらよいのか調べてみました。ついでにツールバーのボタンを取り除いたり、右側にホームボタンがあり、本体を右手で持った状態だとツールバーが右側になりますが、これを左側に移動させたりしています。

こんなことをしなくても、iPhone OS 3.1では簡単になるといいんですけどね。

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *) viewController animated:(BOOL)animated {
 //  全体のビュー
 UIView *cameraView = [viewController.view.subviews objectAtIndex:0];
 //  ツールバーがあるビュー
 UIView *cropOverlay = [cameraView.subviews objectAtIndex:1];
  
 //  PLCropOverlayを取り除く
 //  
 //  取り除くことによって、didShowViewControllerで再びPLCropOverlayがPLCameraに追加される。
 //  ここで取り除かないとsubviewsの無いPLCropOverlayが、didShowViewControllerイベントの
 //  viewControllerで渡される。
 [cropOverlay removeFromSuperview];
}
 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
 //  全体のビュー
 UIView *cameraView = [viewController.view.subviews objectAtIndex:0];
 //  プレビュー(カメラで捉えた映像を表示する部分)
 UIView *previewView = [cameraView.subviews objectAtIndex:0];
 //  ツールバーがあるビュー
 //
 //  retainしておかないと、dismissModalViewControllerAnimatedなどで
 //  UIImagePickerControllerを閉じた時、cropOverlayがあるものだと
 //  想定されているからか、EXC_BAD_ACCESSが発生する。 
 UIView *cropOverlay = [[cameraView.subviews objectAtIndex:1] retain];
 //  ツールバーとプレビューの境界線
 UIView *imageView = [cameraView.subviews objectAtIndex:2];
 //  ツールバー
 UIView *bottomBar = [[cropOverlay.subviews objectAtIndex:0] retain];
 //  ツールバーのボタン群
 UIView *buttons = [bottomBar.subviews objectAtIndex:1];
  
 //  再び取り除き、アイリスシャッターを除去
 [cropOverlay removeFromSuperview];
  
 //  境界線を取り除く
 [imageView removeFromSuperview];
  
 //  プレビューとツールバーの位置を入れ替える
 //  
 //  右側にホームボタンがあり、本体を右手で持った状態だと、
 //  ツールバーが右側に来る。左手でツールバーを操作する際、
 //  視界を横切ることになるので、左側にツールバーを配置し
 //  することにした。
 [bottomBar setFrame:CGRectMake(0, 0, bottomBar.frame.size.width, bottomBar.frame.size.height)];
 [previewView setFrame:CGRectMake(0, bottomBar.frame.size.height, previewView.frame.size.width, previewView.frame.size.height)];
  
 //  ツールバーを180度回線させ、グラデーションの暗い方を外側、明るい方を内側にする
 bottomBar.transform = CGAffineTransformMakeRotation(M_PI);

 //  ツールバーのボタン群を全て取り除く場合
 //
 for(UIView *button in buttons.subviews) {
  [button removeFromSuperview];
 }

 //  カメラボタンを取り除き、キャンセルボタンを270度回転させツールバーの下部に移動する場合
 //  UIView *cancelButton = [buttons.subviews objectAtIndex:1];
 //  cancelButton.transform = CGAffineTransformMakeRotation(270.0f * (M_PI / 180.0f));
 //  [cancelButton setFrame:CGRectMake(bottomBar.frame.size.width - cancelButton.frame.size.width,
 //                              2.5f, cancelButton.frame.size.width, cancelButton.frame.size.height - 5.0f)];
 //  カメラボタンを取り除く
 //  [[buttons.subviews objectAtIndex:0] removeFromSuperview];

 //  ツールバーを全体のビューに追加
 [cameraView addSubview:bottomBar];
 [bottomBar release];
}