AVMetaDataObject.bounds到SwiftUI位置?
我有两种看法。父视图保存一个AVMetaDataObject.bounds到SwiftUI位置?,swift,swiftui,Swift,Swiftui,我有两种看法。父视图保存一个CameraFeedUIViewControllerRepresentable,它传递回AVMetadataFaceObject的边界。我试图在边界应该在的地方画覆盖图。我有点接近了,但是我的映射不太正确。CameraFeed传回一组标量样式的边界,我将几何体读取器乘以它 X和Y好像互换了?(橙色方块效果不好,蓝色方块效果更好) 这个位置不是很完美 感谢:顺便说一句,感谢Wift和示例的黑客攻击。他们非常有助于实现这一目标 我知道我可以在AV对象中使用CALaye
CameraFeed
UIViewControllerRepresentable,它传递回AVMetadataFaceObject
的边界。我试图在边界应该在的地方画覆盖图。我有点接近了,但是我的映射不太正确。CameraFeed
传回一组标量样式的边界,我将几何体读取器乘以它
- X和Y好像互换了?(橙色方块效果不好,蓝色方块效果更好)
- 这个位置不是很完美
CALayer
,如果我这样做,我可以使用更多,但我正在考虑是否可以先尝试这种方法。我也知道我也可以使用CIFaceFeature
。此外,我没有一个真正的深度前置摄像头。我只是想看看我是否可以劫持这个看似最简单的解决方案,让它发挥作用
关于AVMetaDataObject
的边界是如何工作的,以及如何进行参照系转换,我缺少了什么?提前谢谢
struct CameraFeedView:视图{
@状态变量foundFace:CGRect?
@状态变量geometryRect:CGRect=CGRect(x:0,y:0,宽度:0,高度:0)
//@状态变量foundFaceAdjusted:CGRect?
//var testRect:CGRect=CGRect(
//x:0.44112000039964916,
//y:0.1979580322805941,
//宽度:0.333759992007017,
//高度:0.5941303606941507)
var body:一些观点{
GeometryReader(内容:{geometry in
ZStack{
CameraFeed(代码类型:[.face],完成:handleCameraReturn)
如果(foundFace!=零){
矩形()
.中风(
.foregroundColor(.橙色)
.frame(宽度:100,高度:100,对齐方式:。顶部引导)
.职位(
x:geometry.size.width*foundFace!.origin.x,
y:geometry.size.height*foundFace!.origin.y)
FoundObject(frameRect:geometryRect,boundsRect:foundFace!)
.中风(
.foregroundColor(.blue)
}
}
.onAppear(表演:{
设frame=geometry.frame(in:.全局)
geometryRect=CGRect(
原点:CGPoint(x:frame.minX,y:frame.minY),
大小:geometry.size
)
})
})
}
func handleCameraReturn(结果:结果){
切换结果{
成功案例(让边界):
打印(边界)
foundFace=边界
//TODO:添加计时器
案例。失败(let错误):
打印(“扫描失败:\(错误)”)
foundFace=nil
}
}
}
结构FoundObject:形状{
func reMapBoundries(frameRect:CGRect,boundsRect:CGRect)->CGRect{
//Y有界于宽度?真的吗?
设newY=(frameRect.width*boundsRect.origin.x)+(1.0-frameRect.origin.x)
//X有界于高度?真的吗?
设newX=(frameRect.height*boundsRect.origin.y)+(1.0-frameRect.origin.y)
设newWidth=100/(frameRect.width*boundsRect.width)
设newHeight=100/(frameRect.height*boundsRect.height)
设newRect=CGRect(
原点:CGPoint(x:newX,y:newY),
大小:CGSize(宽度:newWidth,高度:newHeight))
返回newRect
}
让frameRect:CGRect
让boundsRect:cRect
func路径(在rect:CGRect中)->path{
var path=path()
addRect(reMapBoundries(frameRect:frameRect,boundsRect:boundsRect))
返回路径
}
}
感谢@pawello2222提供的格式化帮助!
struct CameraFeedView: View {
@State var foundFace:CGRect?
@State var geometryRect:CGRect = CGRect(x: 0, y: 0, width: 0, height: 0)
//@State var foundFaceAdjusted:CGRect?
//var testRect:CGRect = CGRect(
// x: 0.44112000039964916,
// y: 0.1979580322805941,
// width: 0.3337599992007017,
// height: 0.5941303606941507)
var body: some View {
GeometryReader(content: { geometry in
ZStack {
CameraFeed(codeTypes: [.face], completion: handleCameraReturn)
if (foundFace != nil) {
Rectangle()
.stroke()
.foregroundColor(.orange)
.frame(width: 100, height: 100, alignment: .topLeading)
.position(
x: geometry.size.width * foundFace!.origin.x,
y: geometry.size.height * foundFace!.origin.y)
FoundObject(frameRect: geometryRect, boundsRect: foundFace!)
.stroke()
.foregroundColor(.blue)
}
}
.onAppear(perform: {
let frame = geometry.frame(in: .global)
geometryRect = CGRect(
origin: CGPoint(x: frame.minX, y: frame.minY),
size: geometry.size
)
})
})
}
func handleCameraReturn(result: Result<CGRect, CameraFeed.CameraError>) {
switch result {
case .success(let bounds):
print(bounds)
foundFace = bounds
//TODO: Add a timer
case .failure(let error):
print("Scanning failed: \(error)")
foundFace = nil
}
}
}
struct FoundObject: Shape {
func reMapBoundries(frameRect:CGRect, boundsRect:CGRect) -> CGRect {
//Y bounded to width? Really?
let newY = (frameRect.width * boundsRect.origin.x) + (1.0-frameRect.origin.x)
//X bounded to height? Really?
let newX = (frameRect.height * boundsRect.origin.y) + (1.0-frameRect.origin.y)
let newWidth = 100//(frameRect.width * boundsRect.width)
let newHeight = 100//(frameRect.height * boundsRect.height)
let newRect = CGRect(
origin: CGPoint(x: newX, y: newY),
size: CGSize(width: newWidth, height: newHeight))
return newRect
}
let frameRect:CGRect
let boundsRect:CGRect
func path(in rect: CGRect) -> Path {
var path = Path()
path.addRect(reMapBoundries(frameRect: frameRect, boundsRect: boundsRect))
return path
}
}