如果QR码扫描后我的解雇不起作用怎么办?

问题描述 投票:0回答:1

我将扫描QR code中的webView

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)

QRCode扫描

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之后将摄像机窗口调低。

但是相机屏幕仍在冻结屏幕上。无论等待多长时间,我都看不到网络视图屏幕。有什么问题吗?

ios swift qr-code avcapturesession
1个回答
0
投票

previewLayer占据了所有屏幕(边界),并且它隐藏了Web视图,因此您应从超级图层中删除previewLayer以便显示Web视图。

因此解决方案是使用此:

previewLayer.removeFromSuperlayer()

代替

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

© www.soinside.com 2019 - 2024. All rights reserved.