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;

预览层似乎根本没有改变方向,即使在尝试不同的方向选项时也是如此。为了按照推荐的方式执行此操作,我是否还缺少另一个步骤?

编辑:

以下是视图控制器中存在的自动旋转方法:

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeRight;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeRight;
}

解决方案:

这可以通过应用@Spectravideo328 答案中的所有建议以及将预览层添加到 ViewControllers 视图层而不是 displayContainer 子视图来解决。

4

1 回答 1

1

您的问题不是 AvCaptureVideoPreviewLayer 问题,而是一般的 CALayer 问题(previewLayer 是其子类)。

所有 CALayers 都需要设置它们的框架:在您的情况下,我只想添加到您的代码中:

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

使用 self.view.bounds 而不是 self.view.frame 至关重要,这样如果设备旋转,则预览层尺寸会旋转(调整)。

希望这可以帮助。

更新:这是来自supportedInterfaceOrientations 帮助描述:

当用户更改设备方向时,系统会在根视图控制器或填充窗口的最顶部呈现的视图控制器上调用此方法。如果视图控制器支持新方向,则窗口和视图控制器将旋转到新方向。仅当视图控制器的 shouldAutorotate 方法返回 YES 时才会调用此方法。

更新您的 shouldAutorotate 以始终返回 YES。

于 2013-03-10T02:58:12.970 回答