2017-08-10 88 views
0

我想以下降方式关闭相机。但我不明白这一点的工作,当我停止捕获会话和removeFromSuperlayer我得到一个黑色的屏幕关闭它....请参见下面的代码:Swift 3 AVfoundation - 无法关闭相机

import UIKit 
import AVFoundation 

var QRcode = "test" 
var myAddress = "" 

class ScanController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 


    @IBOutlet weak var TEst: UIButton! 

    @IBAction func CloseSession(_ sender: Any) { 
     captureSession.stopRunning() 
     previewLayer?.removeFromSuperlayer() 
    } 

    var desc = String() 

    @IBOutlet weak var messageLabel: UILabel! 

    var videoCaptureDevice: AVCaptureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 
    var device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 
    var output = AVCaptureMetadataOutput() 
    var previewLayer: AVCaptureVideoPreviewLayer? 
    var captureSession = AVCaptureSession() 
    var code: String? 

    @IBOutlet weak var Messagelabel: UILabel! 


    func loadCookies() { 
     guard let cookieArray = UserDefaults.standard.array(forKey: "savedCookies") as? [[HTTPCookiePropertyKey: Any]] else { return } 
     for cookieProperties in cookieArray { 
      if let cookie = HTTPCookie(properties: cookieProperties) { 
       HTTPCookieStorage.shared.setCookie(cookie) 
      } 
     } 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = UIColor.clear 
     self.setupCamera() 
     view.bringSubview(toFront: Messagelabel) 
     view.bringSubview(toFront: TEst) 
    } 




    private func setupCamera() { 

     let input = try? AVCaptureDeviceInput(device: videoCaptureDevice) 

     if self.captureSession.canAddInput(input) { 
      self.captureSession.addInput(input) 
     } 

     self.previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 

     if let videoPreviewLayer = self.previewLayer { 
      videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
      videoPreviewLayer.frame = view.layer.bounds 
      view.layer.addSublayer(videoPreviewLayer) 
     } 

     let metadataOutput = AVCaptureMetadataOutput() 
     if self.captureSession.canAddOutput(metadataOutput) { 
      self.captureSession.addOutput(metadataOutput) 

      metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
      metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code] 
     } else { 
      print("Could not add metadata output") 
     } 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     if (captureSession.isRunning == false) { 
      captureSession.startRunning(); 
     } 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 

     if (captureSession.isRunning == true) { 
      captureSession.stopRunning(); 
     } 
    } 

    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 
     // This is the delegate'smethod that is called when a code is readed 
     for metadata in metadataObjects { 
      let readableObject = metadata as! AVMetadataMachineReadableCodeObject 
      let code = readableObject.stringValue 
      Messagelabel.text = code 
      captureSession.stopRunning(); 

      //self.dismiss(animated: true, completion: nil) 
     } 
    } 
} 

CloseSession按钮动作应该关闭德相机,当我按下按钮时,我得到一个黑色的屏幕,它被冻结。

回答

0

解决了,与标签栏/导航栏结合使用时出现问题。做了一个新的viewcontroller和一切工作正常。