Add source field to DetectedCode and update ScannerView logic for improved barcode handling

- Introduced a `source` field in the `DetectedCode` struct to differentiate between camera and image sources.
- Updated `ScannerView` to enhance the logic for displaying detected codes, including adjustments to the overlay and auto-selection behavior.
- Improved logging for debugging purposes, providing clearer insights into detected codes and their sources.
main
v504 2 months ago
parent 076ba18859
commit dab1808934

@ -7,6 +7,13 @@ struct DetectedCode: Identifiable {
let type: String let type: String
let content: String let content: String
let bounds: CGRect let bounds: CGRect
let source: CodeSource //
}
// MARK: -
enum CodeSource {
case camera //
case image //
} }
// MARK: - // MARK: -

@ -31,29 +31,25 @@ struct ScannerView: View {
.ignoresSafeArea() .ignoresSafeArea()
// //
ScanningOverlayView( ScanningOverlayView(
showPreviewPause: showPreviewPause && showPreviewPause: showPreviewPause &&
((scannerViewModel.detectedCodes.count > 1) || (decodedImageCodes.count > 1)), !scannerViewModel.detectedCodes.isEmpty,
detectedCodesCount: scannerViewModel.detectedCodes.count + decodedImageCodes.count, detectedCodesCount: scannerViewModel.detectedCodes.count,
onImageDecode: { showImagePicker = true } onImageDecode: { showImagePicker = true }
) )
// - // -
if showPreviewPause && if showPreviewPause && !scannerViewModel.detectedCodes.isEmpty {
((!scannerViewModel.detectedCodes.isEmpty && scannerViewModel.detectedCodes.count > 1) ||
(!decodedImageCodes.isEmpty && decodedImageCodes.count > 1)) {
CodePositionOverlay( CodePositionOverlay(
detectedCodes: scannerViewModel.detectedCodes + decodedImageCodes, detectedCodes: scannerViewModel.detectedCodes,
previewLayer: previewLayer, previewLayer: previewLayer,
onCodeSelected: handleCodeSelection onCodeSelected: handleCodeSelection
) )
} }
// - // -
if showPreviewPause && if showPreviewPause && !scannerViewModel.detectedCodes.isEmpty {
((scannerViewModel.detectedCodes.count > 1) || (decodedImageCodes.count > 1)) { if let code = scannerViewModel.detectedCodes.first {
let singleCode = scannerViewModel.detectedCodes.first ?? decodedImageCodes.first
if let code = singleCode {
TestAutoSelectButton( TestAutoSelectButton(
detectedCode: code, detectedCode: code,
onSelect: handleCodeSelection onSelect: handleCodeSelection
@ -199,12 +195,19 @@ struct ScannerView: View {
logInfo("检测到条码数量: \(codes.count)", className: "ScannerView") logInfo("检测到条码数量: \(codes.count)", className: "ScannerView")
//
let _ = print("🔍 handleDetectedCodes 被调用:")
let _ = print(" 条码数量: \(codes.count)")
let _ = print(" 条码内容: \(codes.map { "\($0.type): \($0.content)" })")
let _ = print(" 条码来源: \(codes.map { $0.source })")
if codes.count == 1 { if codes.count == 1 {
logInfo("单个条码,准备自动选择", className: "ScannerView") logInfo("单个条码,显示选择点并0.5秒后自动跳转", className: "ScannerView")
pauseForPreview() pauseForPreview()
autoSelectSingleCode(code: codes[0]) // 0.5
autoSelectSingleCode(code: codes[0], delay: 0.5)
} else { } else {
logInfo("多个条码,等待用户选择", className: "ScannerView") logInfo("多个条码,显示选择点等待用户选择", className: "ScannerView")
pauseForPreview() pauseForPreview()
} }
} }
@ -284,6 +287,11 @@ struct ScannerView: View {
showPreviewPause = true showPreviewPause = true
// //
scannerViewModel.pauseCamera() scannerViewModel.pauseCamera()
//
let _ = print("⏸️ pauseForPreview 被调用:")
let _ = print(" showPreviewPause: \(showPreviewPause)")
let _ = print(" detectedCodes.count: \(scannerViewModel.detectedCodes.count)")
} }
private func resetToScanning() { private func resetToScanning() {
@ -304,10 +312,10 @@ struct ScannerView: View {
logInfo("✅ ScannerView 已重置到扫描状态", className: "ScannerView") logInfo("✅ ScannerView 已重置到扫描状态", className: "ScannerView")
} }
private func autoSelectSingleCode(code: DetectedCode) { private func autoSelectSingleCode(code: DetectedCode, delay: TimeInterval = 1.0) {
logInfo("开始自动选择定时器,条码类型: \(code.type)", className: "ScannerView") logInfo("开始自动选择定时器,条码类型: \(code.type),延迟: \(delay)", className: "ScannerView")
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
let totalCodes = self.scannerViewModel.detectedCodes.count + self.decodedImageCodes.count let totalCodes = self.scannerViewModel.detectedCodes.count + self.decodedImageCodes.count
guard self.showPreviewPause && totalCodes == 1 else { guard self.showPreviewPause && totalCodes == 1 else {
logInfo("条件不满足,取消自动选择", className: "ScannerView") logInfo("条件不满足,取消自动选择", className: "ScannerView")
@ -353,7 +361,8 @@ struct ScannerView: View {
DetectedCode( DetectedCode(
type: "QR Code", type: "QR Code",
content: qrCode.messageString ?? "未知内容", content: qrCode.messageString ?? "未知内容",
bounds: qrCode.bounds bounds: qrCode.bounds,
source: .image
) )
} }
allResults.append(contentsOf: qrResults) allResults.append(contentsOf: qrResults)
@ -375,9 +384,9 @@ struct ScannerView: View {
self.handleCodeSelection(uniqueResults[0]) self.handleCodeSelection(uniqueResults[0])
} }
} else if uniqueResults.count > 1 { } else if uniqueResults.count > 1 {
// //
self.pauseForPreview() self.pauseForPreview()
logInfo("📱 检测到多个条码,显示选择点", className: "ScannerView") logInfo("📱 图片中检测到多个条码,显示选择界面", className: "ScannerView")
} }
} else { } else {
self.isDecodingImage = false self.isDecodingImage = false
@ -443,7 +452,8 @@ struct ScannerView: View {
return DetectedCode( return DetectedCode(
type: barcodeType, type: barcodeType,
content: content, content: content,
bounds: observation.boundingBox bounds: observation.boundingBox,
source: .image
) )
} }
} catch { } catch {

@ -315,7 +315,8 @@ class ScannerViewModel: NSObject, ObservableObject, AVCaptureMetadataOutputObjec
let detectedCode = DetectedCode( let detectedCode = DetectedCode(
type: codeType, type: codeType,
content: stringValue, content: stringValue,
bounds: bounds bounds: bounds,
source: .camera
) )
codes.append(detectedCode) codes.append(detectedCode)

Loading…
Cancel
Save