diff --git a/MyQrCode/ScannerView/Models.swift b/MyQrCode/ScannerView/Models.swift index 88f1ede..172dd95 100644 --- a/MyQrCode/ScannerView/Models.swift +++ b/MyQrCode/ScannerView/Models.swift @@ -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: - 通知名称扩展 diff --git a/MyQrCode/ScannerView/ScannerView.swift b/MyQrCode/ScannerView/ScannerView.swift index c52b3f3..f84423e 100644 --- a/MyQrCode/ScannerView/ScannerView.swift +++ b/MyQrCode/ScannerView/ScannerView.swift @@ -31,29 +31,25 @@ struct ScannerView: View { .ignoresSafeArea() // 扫描界面覆盖层 - ScanningOverlayView( - showPreviewPause: showPreviewPause && - ((scannerViewModel.detectedCodes.count > 1) || (decodedImageCodes.count > 1)), - detectedCodesCount: scannerViewModel.detectedCodes.count + decodedImageCodes.count, - onImageDecode: { showImagePicker = true } - ) + ScanningOverlayView( + showPreviewPause: showPreviewPause && + !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 { diff --git a/MyQrCode/ScannerView/ScannerViewModel.swift b/MyQrCode/ScannerView/ScannerViewModel.swift index 72e3ae3..cbf1249 100644 --- a/MyQrCode/ScannerView/ScannerViewModel.swift +++ b/MyQrCode/ScannerView/ScannerViewModel.swift @@ -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)