Swift 如何将视图设置为在状态更改时不更新
我正在尝试集成一个ARKit视图,该视图使用机器学习处理帧,并在屏幕上显示结果。我已经让ARKit视图与UIViewRepresentable一起工作,并且在状态改变之前一切都正常。如何使AR视图保持静态,并且在状态更改时不更新。我只想更新显示结果的标签 这是我在状态更改时收到的错误:Swift 如何将视图设置为在状态更改时不更新,swift,swiftui,arkit,Swift,Swiftui,Arkit,我正在尝试集成一个ARKit视图,该视图使用机器学习处理帧,并在屏幕上显示结果。我已经让ARKit视图与UIViewRepresentable一起工作,并且在状态改变之前一切都正常。如何使AR视图保持静态,并且在状态更改时不更新。我只想更新显示结果的标签 这是我在状态更改时收到的错误:[CAMetalLayer nextDrawable]由于分配失败而返回nil。 这大概是因为arView在处理帧时不断被重新加载?不过不太确定 这是视图的代码: struct ARControlView: Vie
[CAMetalLayer nextDrawable]由于分配失败而返回nil。
这大概是因为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)
}
}
每当
resultHandler
中的状态发生变化时,就会在ARControlView
中重新评估主体
这会导致由于以下原因而实例化新的ARViewContainer
让arView=ARViewContainer()
位于主体内
变量
如果将let arView=ARViewContainer()
移动到主体
变量之外,则不会在每次状态更改时重新启动arView
。我发现问题实际上并不像看上去那样。我收到的错误是由于帧被设置为.zero,出于某种原因,它返回nil。另外,将其设置为“不自动配置”,因为这也会产生奇怪的问题,导致图像被拉伸
这是我改变的路线:
发件人:
var arView = ARView(frame: .zero)
致:
谢谢其他人的帮助,我很感激 只需将导致状态更改的变量放在另一个环境对象中,您在ArViewContainer中不使用该对象。我尝试了多种方法将结果提供给ARControlView,但没有一种方法不出错。我甚至尝试过一些简单的方法,比如一个按钮,它可以改变一个test@State,而这个test@State只是一个基本字符串,错误就会发生。这就是为什么我得出结论,这是因为视图在使用相机或完成任务时正在重新渲染ArcContainerView。
var arView = ARView(frame: .init(x: 1, y: 1, width: 1, height: 1), cameraMode: .ar, automaticallyConfigureSession: false)