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
相关产品推荐
相关产品推荐

