2017-02-20 85 views
2

所以,我試圖在我的應用程序中使用手機上的相機,並且我成功了,但不幸的是,當使用預覽時,圖層不會填滿整個屏幕Here is an image to show you what it looks likeAVCaptureSession和預覽圖層不會填充整個屏幕

這裏是我的代碼:

if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) { 
     self.previewLayer = previewLayer 
     self.view.layer.addSublayer(self.previewLayer) 
     self.previewLayer.frame = self.view.layer.frame 
     captureSession.startRunning() 

     let dataOutput = AVCaptureVideoDataOutput() 
     dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)] 

     dataOutput.alwaysDiscardsLateVideoFrames = true 

     if captureSession.canAddOutput(dataOutput) { 
      captureSession.addOutput(dataOutput) 
     } 

     captureSession.commitConfiguration() 


     let queue = DispatchQueue(label: "com.Osmo.captureQueue") 
     dataOutput.setSampleBufferDelegate(self, queue: queue) 
    } 
+0

嘗試設置'self.view.layer.bounds'代替 –

+0

對不起,沒有工作。還有什麼我可以做的嗎? –

+0

你在哪裏調用這段代碼? –

回答

0

請嘗試以下方法:

if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) { 
     self.previewLayer = previewLayer 
     self.previewLayer.frame = self.view.bounds 
     self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
     self.view.layer.insertSublayer(self.previewLayer, at: 0) 
     captureSession.startRunning() 

     let dataOutput = AVCaptureVideoDataOutput() 
     dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)] 

     dataOutput.alwaysDiscardsLateVideoFrames = true 

     if captureSession.canAddOutput(dataOutput) { 
      captureSession.addOutput(dataOutput) 
     } 

     captureSession.commitConfiguration() 


     let queue = DispatchQueue(label: "com.Osmo.captureQueue") 
     dataOutput.setSampleBufferDelegate(self, queue: queue) 
    } 
0

試試下面的代碼:

if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) { 
        previewLayer.bounds = view.bounds 
        previewLayer.position = CGPoint(x: view.bounds.midX, y: view.bounds.midY) //CGPointMake(view.bounds.midX, view.bounds.midY) 
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
        let cameraPreview = UIView(frame: CGRect(x: 0.0, y: 0.0, width: view.bounds.width, height: view.bounds.height)); 
        cameraPreview.tag = 44221007 
        cameraPreview.layer.addSublayer(previewLayer) 
        //cameraPreview.addGestureRecognizer(UITapGestureRecognizer(target: self, action:Selector(("saveToCamera:")))) 
        view.addSubview(cameraPreview) 
        self.view.sendSubview(toBack: cameraPreview); 

       } 

蘋果文檔: AVFoundation class image

1

這可能發生,因爲你想從視圖具有自動佈局限制設置預覽層的框架。嘗試viewDidLayoutSubviews方法的重寫添加到您的視圖控制器:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    self.previewLayer.frame = self.view.layer.bounds 
}