iOS Swift 4:二维码扫描成功后如何关闭相机?
解决二维码扫描后无法关闭相机的问题
嘿,我懂你现在的头疼——扫完二维码相机还一直亮着关不掉是吧?其实问题就出在扫描成功后,你没正确停止相机的捕获会话、清理相关资源。我给你一步步捋明白怎么解决:
首先,先写个专门用来停止相机、清理资源的方法,把操作封装起来方便调用:
func stopCameraSession() { // 注意:AVCaptureSession的操作务必放在主线程,避免线程冲突导致崩溃 DispatchQueue.main.async { // 停止捕获会话,这是让相机硬件停止工作的核心步骤 self.captureSession.stopRunning() // 把预览层从父视图移除,这样界面上就看不到相机画面了 self.previewLayer.removeFromSuperlayer() // 置空对象,帮系统释放内存,避免不必要的泄漏 self.captureSession = nil self.previewLayer = nil } }
接下来,你要在扫描到二维码的回调方法里调用这个停止方法。比如你实现AVCaptureMetadataOutputObjectsDelegate的回调时,一旦成功拿到二维码内容,就立刻触发停止操作:
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { guard let firstMetadata = metadataObjects.first as? AVMetadataMachineReadableCodeObject, let qrValue = firstMetadata.stringValue else { return } // 保存二维码内容 self.qrCode = qrValue // 立刻停止相机 self.stopCameraSession() // 这里可以加你自己的后续逻辑,比如弹提示、跳转页面 let alert = UIAlertController(title: "扫描成功", message: qrValue, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "好的", style: .default)) present(alert, animated: true) }
另外给你加个保险:如果你的扫描页面是会被弹出或者推走的,最好在页面即将消失的时候也调用一次停止方法,防止页面关了相机还在后台偷偷运行:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) stopCameraSession() }
核心逻辑就是:停止AVCaptureSession的运行(这会让相机硬件停止工作),然后移除预览层、清理对象,这样相机就彻底关闭啦。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

