2017-02-15 49 views
0

我在我的應用程序中創建一個QR碼掃描器。它包括導航欄,QRcode相機和結果框。這是我想要做的。 With navigation bar如何將導航欄放在攝像機框架的頂部?

但是當我在手機中運行時,導航欄位於相機框架後面。 Without navigation bar

我試圖插入導航欄的出口進入我的代碼,並插入添加view.bringSubview(toFront: navigationbar)但Xcode中說,它不是一個UIview,所以我得到了錯誤。我是IOS開發新手,任何幫助將不勝感激。

這裏是我的代碼部分:

var captureSession:AVCaptureSession? 
    var videoPreviewLayer:AVCaptureVideoPreviewLayer? 
    var qrCodeFrameView:UIView? 
    @IBOutlet weak var messageLabel: UILabel! 
    // Added to support different barcodes 
    let supportedBarCodes = [AVMetadataObjectTypeQRCode, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeUPCECode, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeAztecCode] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

     do { 
      // Get an instance of the AVCaptureDeviceInput class using the previous device object. 
      let input = try AVCaptureDeviceInput(device: captureDevice) 

      // Initialize the captureSession object. 
      captureSession = AVCaptureSession() 
      // Set the input device on the capture session. 
      captureSession?.addInput(input) 

      // Initialize a AVCaptureMetadataOutput object and set it as the output device to the capture session. 
      let captureMetadataOutput = AVCaptureMetadataOutput() 
      captureSession?.addOutput(captureMetadataOutput) 

      // Set delegate and use the default dispatch queue to execute the call back 
      captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 

      // Detect all the supported bar code 
      captureMetadataOutput.metadataObjectTypes = supportedBarCodes 

      // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer. 
      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
      videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
      videoPreviewLayer?.frame = view.layer.bounds 
      view.layer.addSublayer(videoPreviewLayer!) 

      // Start video capture 
      captureSession?.startRunning() 

      // Move the message label to the top view 
      view.bringSubview(toFront: messageLabel) 

      // Initialize QR Code Frame to highlight the QR code 
      qrCodeFrameView = UIView() 

      if let qrCodeFrameView = qrCodeFrameView { 
       qrCodeFrameView.layer.borderColor = UIColor.green.cgColor 
       qrCodeFrameView.layer.borderWidth = 2 
       view.addSubview(qrCodeFrameView) 
       view.bringSubview(toFront: qrCodeFrameView) 
      } 

     } catch { 
      // If any error occurs, simply print it out and don't continue any more. 
      print(error) 
      return 
     } 
+0

可能是你用'view.layer'玩我的意思是你必須添加一個NavigationBar的子圖層並將子視圖放在前面。 –

回答

1

嘗試替換此:

view.layer.addSublayer(videoPreviewLayer!) 

有了:

view.layer.insertSublayer(videoPreviewLayer!, below: qrCodeFrameView.layer) //Or below: messageLabel.layer

儘量不要子層添加到頂部,相反,只需將它插入已經存在的其他子視圖下面,它將確保t他的導航欄顯示正確

+0

感謝您的快速回復!它現在按預期工作! :d –