@ -31,29 +31,25 @@ struct ScannerView: View {
. ignoresSafeArea ( )
// 扫 描 界 面 覆 盖 层
ScanningOverlayView (
showPreviewPause : showPreviewPause &&
( ( scannerViewModel . detectedCodes . count > 1 ) || ( decodedImageCodes . count > 1 ) ) ,
detectedCodesCount : scannerViewModel . detected Codes. count + decodedImage Codes. count ,
onImageDecode : { showImagePicker = true }
)
ScanningOverlayView (
showPreviewPause : showPreviewPause &&
! scannerViewModel . detectedCodes . isEmpty ,
detectedCodesCount : scannerViewModel . detected Codes. 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 {