如何禁用VNDocumentCameraViewController自动扫描,仅手动触发拍摄?
实现VNDocumentCameraViewController仅手动触发扫描的方法
方法一:子类化修改内部扫描器(注意私有API审核风险)
这种方式通过KVC访问控制器内部私有属性,关闭自动文档检测功能,强制用户点击快门按钮才执行扫描:
- 创建自定义子类继承自
VNDocumentCameraViewController:
class ManualScanCameraVC: VNDocumentCameraViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 获取内部文档扫描器实例 guard let scanner = value(forKey: "_scanner") as? VNDocumentCameraScanner else { return } // 关闭自动检测文档功能 scanner.setValue(false, forKey: "_automaticallyDetectsDocument") // 可选:隐藏系统自动扫描提示文本 for subview in view.subviews { if let label = subview as? UILabel, label.text?.contains("扫描") ?? false { label.isHidden = true } } } }
- 使用自定义子类展示相机界面:
let cameraVC = ManualScanCameraVC() cameraVC.delegate = self present(cameraVC, animated: true)
- 实现代理方法处理扫描结果:
extension YourViewController: VNDocumentCameraViewControllerDelegate { func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) { // 处理扫描得到的文档 for pageIndex in 0..<scan.pageCount { let image = scan.imageOfPage(at: pageIndex) // 处理单页图片逻辑 } controller.dismiss(animated: true) } func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) { controller.dismiss(animated: true) } func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFailWithError error: Error) { print("扫描失败:\(error.localizedDescription)") controller.dismiss(animated: true) } }
方法二:完全自定义扫描界面(无审核风险)
如果担心私有API的审核问题,可基于Vision框架自行实现手动扫描逻辑:
- 用
AVCaptureSession搭建相机预览界面 - 添加自定义快门按钮,点击时调用
VNDetectRectanglesRequest检测文档边框 - 根据检测到的边框裁剪图片,完成手动扫描流程
这种方式工作量更大,但完全符合Apple API规范,无审核风险。
内容的提问来源于stack exchange,提问作者joemiddletone
相关产品推荐
相关产品推荐

