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 content: String
let bounds: CGRect
let source: CodeSource //
}
// MARK: -
enum CodeSource {
case camera //
case image //
}
// MARK: -

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

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

Loading…
Cancel
Save