iOS重复调用captureTextFromCamera UIAction致相机全屏重叠问题
captureTextFromCamera重复调用时相机覆盖层异常问题的临时解决办法 问题现象
通过UIAction.captureTextFromCamera创建文本扫描按钮时,出现以下异常行为:
- 首次点击按钮,相机覆盖层正常显示在屏幕底部,点击Insert按钮可获取识别到的文本
- 在同一屏幕内再次点击该按钮,相机覆盖层会全屏显示,且关闭按钮与顶部WiFi、电池状态栏重叠
涉事代码示例:
let textFromCamera = UIAction.captureTextFromCamera(responder: context.coordinator, identifier: nil) let button = UIButton(primaryAction: textFromCamera)
该问题疑似为Apple官方框架bug,目前暂未找到官方修复方案。
临时规避方案
方案1:每次点击重新生成UIAction实例
放弃复用同一个UIAction实例,改为每次按钮点击时创建新的captureTextFromCamera动作:
// 初始化按钮时不设置primaryAction let button = UIButton() // 为按钮添加点击事件,每次点击生成新的动作实例 button.addAction(UIAction.captureTextFromCamera(responder: context.coordinator, identifier: nil), for: .touchUpInside)
这种方式避免了系统复用旧动作实例的状态,大概率能解决布局异常问题。
方案2:手动实现文本扫描流程
改用VisionKit和Vision框架自定义扫描流程,完全控制相机界面的呈现:
- 导入所需框架:
import VisionKit import Vision
- 实现
VNDocumentCameraViewController代理,自定义扫描逻辑:
class TextScannerViewController: UIViewController, VNDocumentCameraViewControllerDelegate { func presentScanner() { let scannerVC = VNDocumentCameraViewController() scannerVC.delegate = self present(scannerVC, animated: true) } func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) { controller.dismiss(animated: true) // 处理扫描到的文档,识别文本 let request = VNRecognizeTextRequest { [weak self] request, error in guard let observations = request.results as? [VNRecognizedTextObservation], error == nil else { return } let recognizedText = observations.compactMap { $0.topCandidates(1).first?.string }.joined(separator: "\n") // 将识别到的文本传递给需要的对象 self?.handleRecognizedText(recognizedText) } // 配置识别参数 request.recognitionLevel = .accurate let imageRequestHandler = VNImageRequestHandler(cgImage: scan.imageOfPage(at: 0).cgImage!) try? imageRequestHandler.perform([request]) } func handleRecognizedText(_ text: String) { // 处理识别结果的逻辑 } }
通过这种方式可以完全自定义相机界面的布局和行为,彻底规避系统自带动作的bug。
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

