Swift 使用AVCaptureVideoPreviewLayer时的布局问题

Swift 使用AVCaptureVideoPreviewLayer时的布局问题,swift,user-interface,avfoundation,Swift,User Interface,Avfoundation,我正在努力学习基础知识。现在,我正试图使最简单的定制相机演示成为可能。一般方案是使用UIView作为AVCaptureVideoPreviewLayer 因此,我通过以下方式创建预览层: let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 以下是我的做法: previewLayer?.frame = self.imageView.bounds self.imageView.layer.ad

我正在努力学习基础知识。现在,我正试图使最简单的定制相机演示成为可能。一般方案是使用
UIView
作为
AVCaptureVideoPreviewLayer

因此,我通过以下方式创建预览层:

let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
以下是我的做法:

previewLayer?.frame = self.imageView.bounds        
self.imageView.layer.addSublayer(previewLayer)
captureSession.startRunning()
基本上就是这样。因此,captureSession正在运行,但摄像头预览在
UIView
中放错了位置。请看下面的图片

然而,我几乎可以肯定我在故事板中做的每件事都是正确的: 很抱歉,我不知道要补充什么,因为我在swift方面相对较新。如果我遗漏了回答问题所需的任何信息,请告诉我

所以问题是,这种UI行为的原因可能是什么


提前感谢。

首先,假设您使用的是Autolayout,请确保您的约束对于故事板中的视图是正确的。如果您没有使用Autolayout,我建议您在继续之前先使用Autolayout

AVCaptureVideoPreviewLayer添加到
imageView
后,需要为其设置帧

previewLayer.frame = self.imageView.layer.bounds

我认为这应该解决它。如果旋转设备,可能需要更新视图控制器的
视图中
预览层
大小
,将布局子视图

,首先,假设您使用的是自动布局,请确保您的约束对于情节提要中的视图是正确的。如果您没有使用Autolayout,我建议您在继续之前先使用Autolayout

AVCaptureVideoPreviewLayer添加到
imageView
后,需要为其设置帧

previewLayer.frame = self.imageView.layer.bounds

我认为这应该解决它。如果旋转设备,可能需要在视图控制器的
视图willlayoutsubviews
中更新
预览层的
大小
,您需要设置视图的内容模式:


previewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill

您需要设置视图的内容模式:


previewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill

您好。谢谢你的回复。添加预览层后,我按照您的建议使用assign layer.bounds。它不起作用。是的,我确实使用自动布局。我很高兴知道你是否还有其他想法。感谢确保您的
imageView
位置正确。您可以设置断点并以这种方式进行检查。您还可以检查
previewLayer
框架。您还可以使用Xcode的Debug/View Debug.OK,我们将对此进行研究。如果其中任何一个有效,我将接受你的回答。谢谢。谢谢你的回复。添加预览层后,我按照您的建议使用assign layer.bounds。它不起作用。是的,我确实使用自动布局。我很高兴知道你是否还有其他想法。感谢确保您的
imageView
位置正确。您可以设置断点并以这种方式进行检查。您还可以检查
previewLayer
框架。您还可以使用Xcode的Debug/View Debug.OK,我们将对此进行研究。如果其中任何一个有效,我将接受你的回答。谢谢