私の場合のように、UIImagePickerController の上にオーバーレイを表示すると同時に、オーバーレイ上のいくつかの UI コンポーネント (トップバーなど) の間にコントローラーの「ライブカメラフィード」(ビュー) を合わせたい場合と下のバー)、次のコードを使用します。これは、上記の SomaMan の回答 (THANKS) に基づいています。主な違いは、UIImagePickerController のビューを、メイン アプリケーション ウィンドウのサブビューではなく、現在のコントローラーのサブビューとして表示することです。次のコードを viewDidLoad() に入れます。
// Overlay view with custom camera controls and a top bar and a bottom bar
self.overlay = [[CameraOverlayView alloc] initWithFrame:self.view.bounds];
[self setOverlayViewModel];
self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
self.imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
self.imagePicker.showsCameraControls = NO;
self.imagePicker.navigationBarHidden = YES;
self.imagePicker.toolbarHidden = YES;
self.imagePicker.delegate = self;
UIView *imagePickerView = self.imagePicker.view;
if ([[UIScreen mainScreen] bounds].size.height == 568.0f) {
// iPhone 5, 16:9 ratio, need to "zoom in" in order to fill the screen since there is extra space between top and bottom bars on a taller screen
self.imagePicker.cameraViewTransform = CGAffineTransformScale(self.imagePicker.cameraViewTransform, 1.5, 1.5); // change 1.5 to suit your needs
}
CGRect cameraViewFrame = CGRectMake(0, self.overlay.topBarHeight,
self.view.bounds.size.width,
self.view.bounds.size.height - self.overlay.topBarHeight - self.overlay.bottomBarHeight);
imagePickerView.frame = cameraViewFrame;
// keep this order so that the overlay view is on top of the "live camera feed" view
[self.view addSubview:imagePickerView];
[self.view addSubview:self.overlay];
ヒント: cameraViewTransform を実行するときは、ピッカーがキャプチャした結果の写真に同じ変換を適用するようにしてください。変換されたピッカーのビューを通してユーザーが見るのと同じ画像で終わるようにしたい場合:P