Ios6 更改AVCaptureVideoPreviewLayer方向的问题

Ios6 更改AVCaptureVideoPreviewLayer方向的问题,ios6,avfoundation,calayer,avcapturesession,autorotate,Ios6,Avfoundation,Calayer,Avcapturesession,Autorotate,我正在使用AVFoundation创建一个摄像机用户界面。包含的viewcontroller将仅以LandscapeRight方向显示。通过预览层更改输出方向时,将正确显示: self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; self.previewLayer.orientation = AVCaptureVideoOrientationLandscapeRi

我正在使用AVFoundation创建一个摄像机用户界面。包含的viewcontroller将仅以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子视图),可以解决此问题

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

所有Calayer都需要设置框架:在您的情况下,我只需向您的代码中添加:

self.previewlayer.frame=self.view.bounds.
请务必使用self.view.bounds而不是self.view.frame,以便在设备旋转时预览层尺寸旋转(调整)

希望这有帮助

更新: 这来自supportedInterfaceOrientations帮助说明:

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


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

感谢您关于边界与帧的说明,我不知道这一区别。然而,这并不能解决问题。无论我使用了什么方向值,预览层似乎都保持不变。@Chris,我认为还有几个地方可能会出现问题。让我们从以下内容开始:您的VC中是否有shouldAutorotateToInterfaceOrientation以让VC知道接受哪些方向?将其更改为“是”,但没有效果。请将self.displayContainer.layer更改为self.view.layer请注意:此代码仅在调用外部viewDidLoad时有效(只是花了很长时间试图找出正确代码失败的原因。苹果在viewDidLoad期间给了视图一个“半初始化”的界限)请参阅下面更新的答案。