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

Swift中为DataScannerViewController设置扫描框并限制16位PIN码识别

需求:限制相机扫描器仅读取16位PIN码

我需要将相机扫描器限制为仅读取16位PIN码,效果类似其他应用的横向窄条扫描框。

已尝试的无效方案:

  • 设置recognizedDataTypes: [.text(textContentType: .telephoneNumber)]:未显示扫描框,且最多只能识别14位数字(我需要16位)
  • 为视图控制器添加regionOfInterest:无任何变化,代码片段:
    let viewController = DataScannerViewController(...)
    viewController.regionOfInterest = CGRect(x: 0, y: 0, width: 200, height: 300)
    viewController.delegate = context.coordinator
    return viewController
    
  • 尝试设置视图控制器的frame:无效果,代码片段:
    let frame = CGRect(x: 0, y:0, width: 200, height: 300)
    viewController.view.frame = frame
    

完整代码:

struct CameraScannerViewController: UIViewControllerRepresentable {

@Binding var startScanning: Bool
@Binding var scanResult: String

func makeCoordinator() -> Coordinator {
    Coordinator(self)
}

func makeUIViewController(context: Context) -> DataScannerViewController {
    let frame = CGRect(x: 0, y: 0, width: 200, height: 300)
    let viewController = DataScannerViewController(
        recognizedDataTypes: [.text(textContentType: .telephoneNumber)],
        qualityLevel: .fast,
        recognizesMultipleItems: false,
        isHighFrameRateTrackingEnabled: false,
        isHighlightingEnabled: true)
    //viewController.view.frame = frame
    //viewController.regionOfInterest = CGRect(x: 0, y: 0, width: 200, height: 300)
    viewController.delegate = context.coordinator
    return viewController
}

func updateUIViewController(_ viewController: DataScannerViewController, context: Context) {
    if startScanning{
        try? viewController.startScanning()
    }else {
        viewController.stopScanning()
    }
}

class Coordinator: NSObject, DataScannerViewControllerDelegate {
    var parent: CameraScannerViewController
    init(_ parent: CameraScannerViewController){
        self.parent = parent
    }
    
    func dataScanner(_ dataScanner: DataScannerViewController, didTapOn item: RecognizedItem) {
        switch item {
        case .text(let text):
            parent.scanResult = text.transcript
            dataScanner.stopScanning()
            dataScanner.dismiss(animated: true)
        default:
            break
        }
    }
}

内容的提问来源于stack exchange,提问作者KiDo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:47:08