Search code examples
iosxcodeswiftavcapturesession

How should I properly add constraints to an AVCaptureVideoPreviewLayer?


I have a Navigation Bar at the top of my view. I'm adding an AVCaptureVideoPreviewLayer but the way it gets positioned, there is a gap between the bottom of the Nav Bar and the top of the Preview Layer.

    self.view.backgroundColor = UIColor.redColor()

    var navBarFrame = CGRectMake(0, 0, self.view.frame.width, 64.0)
    var navBar = UINavigationBar(frame: navBarFrame)
    var navItem = UINavigationItem()
    navItem.title = "zzzz"
    navBar.pushNavigationItem(navItem, animated: false)
    self.view.addSubview(navBar)


    // init device input
    var error: NSErrorPointer!
    var deviceInput: AVCaptureInput = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: error) as AVCaptureInput
    self.stillImageOutput = AVCaptureStillImageOutput()


    // init session
    self.session = AVCaptureSession()
    self.session.sessionPreset = AVCaptureSessionPresetPhoto
    self.session.addInput(deviceInput as AVCaptureInput)
    self.session.addOutput(self.stillImageOutput)


    // layer for preview
    var previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.layerWithSession(self.session) as AVCaptureVideoPreviewLayer
    previewLayer.frame = self.view.bounds
    self.view.layer.addSublayer(previewLayer)

How can I ensure that the Preview Layer is constrained to the bottom of the Nav Bar?


Solution

  • Design a view in IB with the constraints you want. Add the preview layer to this view instead, you also need to update your layer size when the view size changes, use the layoutSubviews method from your view controller to get updates when the size changes.