【问题标题】:What should I do if my dismiss does not work after a QRcode scan?如果我的解雇在二维码扫描后不起作用怎么办?
【发布时间】:2019-10-29 08:30:15
【问题描述】:

我要扫描webView中的QR code

QR code扫描好,可以读取数据,

但问题是,扫描后相机屏幕不会关闭。我正在运行dismiss() 函数。

webView 加载

@IBOutlet weak var indicator: UIImageView!
@IBOutlet var wkWebView: WKWebView!
...
 let config = WKWebViewConfiguration()

        contentController.add(self, name: "native")

        config.userContentController = contentController

        wkWebView = WKWebView(frame: wkWebView.frame, configuration: config)

        wkWebView.uiDelegate = self
        wkWebView.navigationDelegate = self

        view.addSubview(wkWebView)
        view.addSubview(indicator)
let localFilePath = Bundle.main.url(forResource: webUrl, withExtension: "html")
let myRequest = URLRequest(url: localFilePath)
wkWebView.load(myRequest)

二维码扫描

var captureSession: AVCaptureSession!
var previewLayer: AVCaptureVideoPreviewLayer!

   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 qrcodeScan(){
        view.backgroundColor = UIColor.black
        captureSession = AVCaptureSession()

        guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }
        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 = [.qr]
        } else {
            failed()
            return
        }

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

        captureSession.startRunning()
    }

    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        captureSession.stopRunning()

        if let metadataObject = metadataObjects.first {
            guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
            guard let stringValue = readableObject.stringValue else { return }
            AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            found(code: stringValue)
        }

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

    func found(code: String) {
        Log.Info(code)
    }


    func failed() {
        captureSession = nil
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }


    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }

正如您从我的代码中看到的那样,我在阅读QR code 后尝试关闭相机窗口。

但相机屏幕仍处于冻结屏幕上。无论我等待多久,我都看不到网络视图屏幕。有什么问题?

【问题讨论】:

  • 您是否在不同的UIViewController 中显示网页视图和二维码扫描?
  • 不,@MarwenDoukh-MaruänDuch 我只展示了同一个文件的代码,将其拆分以增强代码的可读性。
  • 试试这个:previewLayer.removeFromSuperlayer() 而不是 self.dismiss(animated: true, completion: nil)
  • 我会把它作为答案,所以其他开发者可以使用它

标签: ios swift qr-code avcapturesession


【解决方案1】:

previewLayer 占据了所有屏幕(边界)并隐藏了 webview,因此您应该从超级层中删除 previewLayer 以显示 webview。

所以解决方案是使用这个:

previewLayer.removeFromSuperlayer()

而不是

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

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多