AVCaptureVideoPreviewLayer

AVCaptureVideoPreviewLayer *avLayer = [AVCaptureVideoPreviewLayer layerWithSession:session]; avLayer.frame = self.view.frame; [self.view.layer addSublayer:avLayer]; 

我使用AVCaptureVideoPreviewLayer在视图上显示video。 但是video的视图并没有填满iPhone4的屏幕(左右两个灰色条)

我希望video填满整个屏幕。 我该如何处理呢? 非常感谢你!

在这里输入图像说明

也许这个解决了吗?

 CGRect bounds=view.layer.bounds; avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; avLayer.bounds=bounds; avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); 

造成混淆的一个潜在原因是AVCaptureVideoPreviewLayer是一个CoreAnimation层,在上面的所有答案中,静态地(例如没有约束地)定位相对于视图。 如果您使用约束来布局视图,这些不会自动调整预览图层的大小。

这意味着您无法在viewDidLoad设置预览图层,因为布局尚未发生,预览图层将按照界面生成器中的设置进行设置。

相反,在您的ViewController上重写viewDidLayoutSubviews ,并在那里放置预览图层。

 - (void)viewDidLayoutSubviews { CGRect bounds=view.layer.bounds; avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; avLayer.bounds=bounds; avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); } 

@ fitzwald的答案会给你想要的结果,但有一个更简单的方法。 发生什么事是会话预设默认为video – 高(这不符合屏幕的高宽比)。 全屏预览(如Camera.app中)可以通过使用照片预设来实现。 简单地设置

 session.sessionPreset = AVCaptureSessionPresetPhoto; 

在开始你的会议之前。 如果您想了解更多信息 ,请参阅Apple文档 。

对于Google来说,这是公认的答案,但使用Swift略有不同:

 var bounds:CGRect = self.view.layer.bounds previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill previewLayer?.bounds = bounds previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)) 

我使用下面的代码来实现这一点

 previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height); previewLayer.orientation = [[UIDevice currentDevice] orientation]; previewLayer.contentsGravity = kCAGravityResizeAspectFill;