更改AVCaptureVideoPreviewLayer方向的问题

4

我正在使用AVFoundation创建一个视频摄像头UI。包含视图控制器只会在横向右侧方向显示。当通过预览层更改输出方向时,它会正确显示:

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子视图。


请查看下面更新的答案。 - Khaled Barazi
1个回答

1

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

所有 CALayer 都需要设置它们的 frames:在您的情况下,我只需将以下代码添加到您的代码中:

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

重要提示:使用self.view.bounds而不是self.view.frame,这样预览层的尺寸会随设备旋转而调整。

希望这有所帮助。

更新: 这是supportedInterfaceOrientations帮助描述中的内容:

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

更新您的shouldAutorotate始终返回YES。


谢谢你提醒我关于边界和框架的区别,我之前并不知道。然而,这并没有解决问题。无论我使用什么方向值,预览层似乎都保持不变。 - Chris
@Chris,我认为还有几个其他的地方可能会出现问题。让我们从这里开始:您的VC中是否有shouldAutorotateToInterfaceOrientation来告诉VC哪些方向是可接受的? - Khaled Barazi
改成了YES,但是没有任何效果。 - Chris
请将 self.displayContainer.layer 更改为 self.view.layer。 - Khaled Barazi
请注意:此代码仅在viewDidLoad之外调用时有效(我刚刚花费了很长时间来弄清楚为什么正确的代码失败了。Apple在viewDidLoad期间给视图“半初始化”边界) - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接