如何将视图设置为在状态更改时不更新
How to set a view to NOT update when a state changes
我正在尝试集成一个 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)
}
}
每次 resultHandler
中的状态发生变化时,body
都会在 ARControlView
中重新计算。
这会导致实例化一个新的 ARViewContainer
let arView = ARViewContainer()
在 body
变量中。
如果将 let arView = ARViewContainer()
移到 body
变量之外,则每次状态更改时 arView
都不会重新实例化。
我发现问题其实并不像看上去的那样。我收到的错误是由于框架被设置为 .zero,由于某种原因使其 return nil。还要将其设置为不自动配置,因为这也会产生导致图像被拉伸的奇怪问题。
这是我更改的行:
发件人:
var arView = ARView(frame: .zero)
收件人:
var arView = ARView(frame: .init(x: 1, y: 1, width: 1, height: 1), cameraMode: .ar, automaticallyConfigureSession: false)
感谢其他人的帮助,我很感激!
我正在尝试集成一个 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)
}
}
每次 resultHandler
中的状态发生变化时,body
都会在 ARControlView
中重新计算。
这会导致实例化一个新的 ARViewContainer
let arView = ARViewContainer()
在 body
变量中。
如果将 let arView = ARViewContainer()
移到 body
变量之外,则每次状态更改时 arView
都不会重新实例化。
我发现问题其实并不像看上去的那样。我收到的错误是由于框架被设置为 .zero,由于某种原因使其 return nil。还要将其设置为不自动配置,因为这也会产生导致图像被拉伸的奇怪问题。
这是我更改的行:
发件人:
var arView = ARView(frame: .zero)
收件人:
var arView = ARView(frame: .init(x: 1, y: 1, width: 1, height: 1), cameraMode: .ar, automaticallyConfigureSession: false)
感谢其他人的帮助,我很感激!