2016-10-09 19 views
0

におけるカメラビューの上にオブジェクトを追加し、私はそれに関連付けられた次のクラスがあり、ビューコントローラ、を有する:は私のストーリーボード上のバーコードスキャナアプリ(スウィフト3)

import AVFoundation 
import UIKit 

class ScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 
    var captureSession: AVCaptureSession! 
    var previewLayer: AVCaptureVideoPreviewLayer! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.backgroundColor = UIColor.black 
     captureSession = AVCaptureSession() 

     let videoCaptureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 
     let videoInput: AVCaptureDeviceInput 

     do { 
      videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) 
     } catch { 
      return 
     } 

     if (captureSession.canAddInput(videoInput)) { 
      captureSession.addInput(videoInput) 
     } else { 
      failed(); 
      return; 
     } 

     let metadataOutput = AVCaptureMetadataOutput() 

     if (captureSession.canAddOutput(metadataOutput)) { 
      captureSession.addOutput(metadataOutput) 

      metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
      metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeCode39Code] 
     } else { 
      failed() 
      return 
     } 

     previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); 
     previewLayer.frame = view.layer.bounds; 
     previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
     view.layer.addSublayer(previewLayer); 

     captureSession.startRunning(); 
    } 

    func failed() { 
     let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .alert) 
     ac.addAction(UIAlertAction(title: "OK", style: .default)) 
     present(ac, animated: true) 
     captureSession = nil 
    } 

    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!) { 
     captureSession.stopRunning() 

     let initialView: PLLogViewController = presentingViewController as! PLLogViewController 

     if let metadataObject = metadataObjects.first { 
      let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject; 

      AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) 
      found(code: readableObject.stringValue); 
      initialView.setResults(code: readableObject.stringValue) 
     } 

     dismiss(animated: true) 
    } 

    func found(code: String) { 
     print(code) 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return .portrait 
    } 
} 

このコードは、基本的にカメラビューを開始しますバーコードスキャナーとして機能します。デバイスをバーコードに合わせると、バーコードが検出され、結果がテキストフィールドにプッシュされます。

これはすべて素晴らしいです。私の質問は - 私はいくつかの他の要素を画面上に表示したいです。今、私の画面全体がカメラによって追い抜かれているので、このビューにアクセスすると、バーコードをスキャンするか、アプリケーションをシャットダウンする必要があります。

オブジェクトライブラリからドラッグするだけでビューに他の要素を追加しようとしましたが、カメラがこれらの項目をオーバーレイしてアクセス不能になっているようです。

カメラビューの上に追加する2つの要素があります。最初のイメージは、ユーザーがスキャンしているバーコードのどこに "フィット"するべきかを示すための "ブラケット"のようなイメージです。

2番目のボタンは、ユーザーがカメラビューから取り消すことができるボタンです。

最終的に私の質問は単純に、プログラムで初期化されているカメラビューの上に要素を追加する方法です。

+0

あなたのプレビュー層の境界はあなたのビューコントローラのビューのものと同じです。だからあなたのカメラはすべての画面を占めるのです。 – Adeel

答えて

0

あなたのビューでコントローラを表示するビデオプレビューを表示したい場合は、ビュー全体ではなくそのレイヤにプレビューレイヤを追加するだけでした。

ので、同様:

//ビデオプレビュー層を初期化して、ビュー層にサブレイヤとして追加します。

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
    previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
    previewLayer?.frame = /*your views name here i e qrView*/.layer.bounds 
    /*your views name here i e qrView*/.layer.addSublayer(videoPreviewLayer!) 

//の代わりに、

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); 
    previewLayer.frame = view.layer.bounds; 
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    view.layer.addSublayer(previewLayer); 
関連する問題