如何设置摄像机视图以填充其父视图

111*_*110 18 uiview ios avcapturesession swift ios8

我不知道这个问题是关于自动布局还是我做错了什么.
我有一个UIViewController和一个UIView内部.
而我正在使用AVCaptureSession相机视图.
问题是,当我在摄像机视图中加载视图时,它不会填充该视图,所以我在左侧和右侧有间隙.
我要做的是UIView用相机填满整个.
这是我的代码:

...
@IBOutlet weak var camView: UIView!
var previewLayer    : AVCaptureVideoPreviewLayer!

override func viewDidLoad() {
...
previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.frame = self.camView.layer.bounds
self.camView.layer.addSublayer(previewLayer)
session.startRunning()
Run Code Online (Sandbox Code Playgroud)

Eri*_*rik 17

布局子视图后,您需要进行设置.在viewDidLayoutSubviews

添加视图

添加插座

添加约束

-(void)viewDidLayoutSubviews
{
    [self setupAVCapture];
}


- (void)setupAVCapture {
    NSError *error = nil;

    AVCaptureSession *session = [AVCaptureSession new];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
        [session setSessionPreset:AVCaptureSessionPreset640x480];
    else
        [session setSessionPreset:AVCaptureSessionPresetPhoto];

    // Select a video device, make an input
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

    if ([session canAddInput:deviceInput])
        [session addInput:deviceInput];

    AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
        [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

    previewLayer.frame = self.camView.bounds;
    [self.camView.layer addSublayer:previewLayer];
    [session startRunning];
}
Run Code Online (Sandbox Code Playgroud)

你可能发生的事情是你的界限还没有准确设置,viewDidLoad因为子视图还没有根据他们的约束进行布局.当您改为设置框架previewLayerviewDidLayoutSubviews,它将采用正确的方向.但要小心,你还需要调整旋转预览和不旋转预览,并修改我使用的代码.对不起它不是很快,但这不重要.只需将您的实例化和设置移动到viewDidLayoutSubviews

所以对于你的代码,你应该做这样的事情:

override func viewDidLayoutSubviews() {
...
previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.frame = self.camView.layer.bounds
self.camView.layer.addSublayer(previewLayer)
session.startRunning()
Run Code Online (Sandbox Code Playgroud)