我正在实现一个由AVCaptureVideoPreviewLayer组成的视图。除了顶部的导航栏(视图嵌入在导航控制器中)之外,该视图应占据整个屏幕。AVCaptureVideoPreviewLayer在iPhone6上正确显示
我的代码如下所示,显示了我如何设置捕获会话并将前置摄像头添加为输入(如果可用)。
//Set up capture Session
session = [[AVCaptureSession alloc]init];
session.sessionPreset = AVCaptureSessionPresetPhoto;
//Add a camera as input if we have a front-facing camera available
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
NSError *error;
for (AVCaptureDevice *device in devices) {
if ([device position] == AVCaptureDevicePositionBack) {
//Set our input
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
[session addInput:input];
if (!input) {
NSLog(@"No Input");
}
}
}
下面是输出配置的位置,摄像机输出视图作为子视图添加,而视图的边界由帧决定。
//Output
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[session addOutput:output];
output.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) };
//Preview Layer
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
previewLayer.frame = self.view.bounds;
self.view.translatesAutoresizingMaskIntoConstraints = NO;
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:previewLayer];
正如你可以在一个iPhone 6运行时,看到下面的截图,预览层不占用屏幕的整体(空白到相机视图的右边和导航栏下应该由预览层填满):
但是,它并适当地填充在屏幕上下面的iPhone 5截图(以及在iPhone 4,4S,5S和)。有没有人有任何洞察力为什么?
第一件事,我会被记录,断点或“调试视图层次检查“是,如果在添加预览图层的时候'self.view'实际上有你期望它的边界。对我来说,它看起来很像UIView本身可以固定为320的宽度,例如,通过将其框架设置在代码或自动布局约束的某处。 – Gamma