我有一个 ARView,它会在 coachingOverlay
成功完成后立即填充。
如何从另一个 View (Navbar
) 调用一个函数来重置这个 ARView 并运行 coachingOverlay
来再次初始化 AR?
struct ContentView : View {
var body: some View {
ZStack {
ARViewContainer().edgesIgnoringSafeArea(.all)
VStack {
Spacer()
Navbar()
}
.padding()
}
}
}
struct ARViewContainer: UIViewRepresentable {
func makeUIView(context: Context) -> ARView {
let arView = ARView(frame: .zero)
arView.addCoaching()
let config = ARWorldTrackingConfiguration()
config.planeDetection = .horizontal
arView.session.run(config, options: [])
return arView
}
func updateUIView(_ uiView: ARView, context: Context) {}
}
extension ARView: ARCoachingOverlayViewDelegate {
func addCoaching() {
let coachingOverlay = ARCoachingOverlayView()
coachingOverlay.delegate = self
coachingOverlay.session = self.session
coachingOverlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
coachingOverlay.goal = .anyPlane
self.addSubview(coachingOverlay)
}
public func coachingOverlayViewDidDeactivate(_ coachingOverlayView: ARCoachingOverlayView) {
// Load the "Box" scene from the "Experience" Reality File
let boxAnchor = try! Experience.loadBox()
// Add the box anchor to the scene
self.scene.anchors.append(boxAnchor)
}
}
struct Navbar: View {
let arView = ARView()
var body: some View {
Button(action: {
//
}) {
Image(systemName: "trash")
.foregroundColor(Color.black)
.padding()
}
.background(Color.white)
}
}
最佳答案
要从 Navbar
调用指导覆盖和跟踪配置,请使用 coordinator属性(property)。
我想您不需要重置 ARView 本身。您需要做的就是使用以下选项重新运行 session :.resetTracking
和 .removeExistingAnchors
。它会删除以前的跟踪 map ,您可以从头开始。
arView.session.run(config, options: [.removeExistingAnchors, .resetTracking])
此外,如果您想将 Coaching Overlay 视为单次操作,然后必须将其关闭,请使用以下设置:
coachingOverlayView.activatesAutomatically = false
关于ios - 重置 ARView 并再次运行 Coaching Overlay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62388053/