4

AVFoundation を使用してビデオ カメラ UI を作成しています。含まれているビューコントローラーは、LandscapeRight 方向でのみ表示されます。プレビュー レイヤーを介して出力方向を変更すると、正しく表示されます。

self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
self.previewLayer.orientation = AVCaptureVideoOrientationLandscapeRight;
[self.displayContainer.layer addSublayer:self.previewLayer];

ただし、AVCaptureVideoPreviewLayer の方向プロパティは廃止され、AVCaptureConnection.videoOrientation が優先されることを認識しています。代わりにそれを使用する場合:

    self.previewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;

方向のさまざまなオプションを試しても、プレビューレイヤーは方向をまったく変更していないように見えます。これを推奨される方法で行うために、私が見逃している別のステップはありますか?

編集:

以下は、View Controller に存在する自動回転メソッドです。

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeRight;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeRight;
}

解決:

これは、@ Spectravideo328 の回答のすべてのアドバイスを適用することと、displayContainer サブビューではなく ViewControllers ビュー レイヤーにプレビュー レイヤーを追加することの両方によって解決されます。

4

1 に答える 1

1

あなたの問題は AvCaptureVideoPreviewLayer の問題ではなく、一般的な CALayer の問題です (previewLayer はそのサブクラスです)。

すべての CALayers にはフレーム セットが必要です。あなたの場合、コードに次のように追加します。

self.previewlayer.frame=self.view.bounds.

デバイスが回転した場合にプレビューレイヤーの寸法が回転 (調整) されるように、self.view.frame ではなく self.view.bounds を使用することが重要です。

お役に立てれば。

更新: これは supportedInterfaceOrientations ヘルプの説明からのものです:

ユーザーがデバイスの向きを変更すると、システムは、ルート ビュー コントローラーまたはウィンドウを埋める最上位のビュー コントローラーでこのメソッドを呼び出します。ビュー コントローラーが新しい向きをサポートしている場合、ウィンドウとビュー コントローラーは新しい向きに回転します。このメソッドは、View Controller の shouldAutorotate メソッドが YES を返す場合にのみ呼び出されます。

shouldAutorotate を更新して、常に YES を返すようにします。

于 2013-03-10T02:58:12.970 に答える