@ -87,9 +87,15 @@ struct ScannerView: View {
}
private func handleCodeSelection ( _ selectedCode : DetectedCode ) {
logInfo ( " 用户选择了条码: \( selectedCode . content ) " , className : " ScannerView " )
logInfo ( " 🎯 ScannerView 收到条码选择回调 " , className : " ScannerView " )
logInfo ( " 选择的条码ID: \( selectedCode . id ) " , className : " ScannerView " )
logInfo ( " 选择的条码类型: \( selectedCode . type ) " , className : " ScannerView " )
logInfo ( " 选择的条码内容: \( selectedCode . content ) " , className : " ScannerView " )
logInfo ( " 选择的条码位置: \( selectedCode . bounds ) " , className : " ScannerView " )
let formattedResult = " 类型: \( selectedCode . type ) \n 内容: \( selectedCode . content ) "
logInfo ( " 格式化结果: \( formattedResult ) " , className : " ScannerView " )
NotificationCenter . default . post ( name : . scannerDidScanCode , object : formattedResult )
dismiss ( )
}
@ -435,9 +441,41 @@ struct CodePositionOverlay: View {
onCodeSelected : onCodeSelected
)
}
// 调 试 信 息 : 显 示 触 摸 区 域 边 界
#if DEBUG
ForEach ( detectedCodes ) { code in
let position = calculateDebugPosition ( code : code , screenSize : geometry . size )
Rectangle ( )
. stroke ( Color . red , lineWidth : 1 )
. frame ( width : 80 , height : 80 )
. position ( x : position . x , y : position . y )
. opacity ( 0.3 )
}
#endif
}
}
. allowsHitTesting ( true )
. contentShape ( Rectangle ( ) ) // 确 保 整 个 区 域 都 可 以 接 收 触 摸 事 件
. zIndex ( 1000 ) // 确 保 在 最 上 层 , 不 被 其 他 视 图 遮 挡
}
// 调 试 用 的 位 置 计 算 方 法
private func calculateDebugPosition ( code : DetectedCode , screenSize : CGSize ) -> CGPoint {
guard let previewLayer = previewLayer else {
return CGPoint ( x : screenSize . width / 2 , y : screenSize . height / 2 )
}
let metadataObject = code . bounds
let convertedPoint = previewLayer . layerPointConverted ( fromCaptureDevicePoint : CGPoint (
x : metadataObject . midX ,
y : metadataObject . midY
) )
let clampedX = max ( 40 , min ( screenSize . width - 40 , convertedPoint . x ) )
let clampedY = max ( 40 , min ( screenSize . height - 40 , convertedPoint . y ) )
return CGPoint ( x : clampedX , y : clampedY )
}
}
@ -453,6 +491,25 @@ struct CodePositionMarker: View {
let position = calculatePosition ( screenSize : geometry . size )
ZStack {
// 触 摸 区 域 背 景 ( 透 明 , 但 可 以 接 收 触 摸 事 件 )
Circle ( )
. fill ( Color . clear )
. frame ( width : 80 , height : 80 )
. contentShape ( Circle ( ) )
. onTapGesture {
logDebug ( " 🎯 CodePositionMarker 被点击! " , className : " CodePositionMarker " )
logDebug ( " 条码ID: \( code . id ) " , className : " CodePositionMarker " )
logDebug ( " 条码类型: \( code . type ) " , className : " CodePositionMarker " )
logDebug ( " 条码内容: \( code . content ) " , className : " CodePositionMarker " )
logDebug ( " 点击位置: x= \( position . x ) , y= \( position . y ) " , className : " CodePositionMarker " )
// 添 加 触 觉 反 馈
let impactFeedback = UIImpactFeedbackGenerator ( style : . medium )
impactFeedback . impactOccurred ( )
onCodeSelected ( code )
}
// 外 圈
Circle ( )
. stroke ( Color . green , lineWidth : 3 )
@ -469,14 +526,7 @@ struct CodePositionMarker: View {
. frame ( width : 6 , height : 6 )
}
. position ( x : position . x , y : position . y )
. background (
Circle ( )
. fill ( Color . clear )
. frame ( width : 60 , height : 60 )
)
. onTapGesture {
onCodeSelected ( code )
}
. zIndex ( 1001 ) // 确 保 触 摸 区 域 在 最 上 层
. onAppear {
logDebug ( " CodePositionMarker appeared at: x= \( position . x ) , y= \( position . y ) " , className : " CodePositionMarker " )
logDebug ( " Screen size: \( geometry . size ) " , className : " CodePositionMarker " )