You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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框架自定义扫描流程,完全控制相机界面的呈现:

  1. 导入所需框架:
import VisionKit
import Vision
  1. 实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:48:35