我正在尝试集成一个ARKit视图,该视图通过机器学习来处理框架并在屏幕上显示结果。我已经将ARKit视图与UIViewRepresentable一起使用,并且一切工作到状态改变为止。如何将AR视图设为静态,并且在状态更改时不更新。我只想更新显示结果的标签。
这是状态更改时收到的错误:[CAMetalLayer nextDrawable] returning nil because allocation failed.
这大概是因为arView在处理帧时不断重载吗?不太确定。
这是该视图的代码:
struct ARControlView: View {
@EnvironmentObject var resultHandler: ResultHandler
var body: some View {
let arView = ARViewContainer() // This is the UIViewRepresentable containing the ARKit view.
return ZStack {
arView
VStack {
Text(self.resultHandler.gesture.rawValue)
}
.onAppear {
arView.restartARSession()
}
.onDisappear {
arView.pauseArSession()
}
}
}
}
这是针对ARViewContainer的:
struct ARViewContainer: UIViewRepresentable {
var arView = ARView(frame: .zero)
@EnvironmentObject var resultHandler: ResultHandler
func makeUIView(context: Context) -> ARView {
arView.session.delegate = context.coordinator
arView.session.run(AROrientationTrackingConfiguration())
return arView
}
func pauseArSession() {
arView.session.pause()
}
func restartARSession() {
arView.session.run(AROrientationTrackingConfiguration())
}
func updateUIView(_ uiView: ARView, context: Context) {}
class Coordinator: NSObject, ARSessionDelegate {
// Process frames here...
}
func makeCoordinator() -> ARViewContainer.Coordinator {
Coordinator(self)
}
}
答案 0 :(得分:0)
每次resultHandler
中的状态发生变化时,body
都会在ARControlView
中重新评估。
这将导致新的ARViewContainer
实例化,原因是
let arView = ARViewContainer()
位于body
变量中。
如果将let arView = ARViewContainer()
移到body
变量之外,则arView
不会在每次状态改变时都被重新实例化。
答案 1 :(得分:-1)
我发现问题实际上并不是看起来的那样。我收到的错误是由于帧设置为.zero,由于某种原因使其返回nil。还要将其设置为不自动配置,因为这还会造成奇怪的问题,导致图像被拉伸。
这是我更改的行:
发件人:
var arView = ARView(frame: .zero)
收件人:
var arView = ARView(frame: .init(x: 1, y: 1, width: 1, height: 1), cameraMode: .ar, automaticallyConfigureSession: false)
非常感谢其他人的帮助!