0

ナビゲーションバーにバーコードスキャナのビューを追加したいと思います。このようにして、バーコードスキャナ(モーダル)ビューを閉じることができますが、ナビゲーションバーがここにないため、何かが動作しません。スキャナビューのナビゲーションバー - IOS - Swift

これらは私のsetupNavBar方法やセットアップに私のナビゲーションバーの私navigationBarです:この下に

let navBar: UINavigationBar = { 
     let bar = UINavigationBar() 
     bar.translatesAutoresizingMaskIntoConstraints = false 
     return bar 
    }() 

    func setupNavBar(){ 

     view.addSubview(navBar) 
     view.bringSubview(toFront: navBar) 

     navBar.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.09).isActive = true 
     navBar.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 
     navBar.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
     navBar.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 
     navBar.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 

     let doneItem = UIBarButtonItem(title:"Cancel",style: .done, target: nil, action: #selector(doneButton)); 
     let navItem = UINavigationItem(title: "Scanner"); 
     navItem.rightBarButtonItem = doneItem; 
     navBar.setItems([navItem], animated: false); 

    } 


func doneButton(){ 

    let presentingViewController: UIViewController! = self.presentingViewController 
    presentingViewController.presentingViewController!.dismiss(animated: true, completion: nil) 

} 

スキャナのための私のコードです:

var captureSession: AVCaptureSession! 
    var previewLayer: AVCaptureVideoPreviewLayer! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupNavBar() 
     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] 
     } 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() 

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

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

      self.isbn = readableObject.stringValue 
      self.performSegue(withIdentifier: "scanToSell", sender: nil) 
     } 

    } 

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

    override var prefersStatusBarHidden: Bool { 
     return true 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return .portrait 
    } 

事前にありがとうございます。グッドジョブ

答えて

0

私は自分のエラーを発見しました。私のviewDidLoadメソッドでは、setupNavBarはこのように位置を変更する必要があります。

override func viewDidLoad() { 
    super.viewDidLoad() 

    // setupNavBar() No 
    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] 
     } else { 
      failed() 
      return 
     } 

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

    setupNavBar() // Yes 

     captureSession.startRunning(); 
    } 
1

私は数日前に同じ問題に直面しました。私はscannerviewcontrollerを作成しました。 これを確認してください:https://gist.github.com/Raghvendra7/ff6335c47bbca04fb88d1cb76917d2e5、 キャンセルの問題を解決しました。 お待ちしています。 このコントローラのスキャナエフェクトで作業し、完了したら更新します。

+0

返信ありがとうございますが、エラーが見つかりました。 – Carlo

関連する問題