Dismissing immersive views
When running an app that uses an immersive view, such as this Jenga demo, you might want the immersive scene to disappear when the window is closed. We can do this using the scenePhase environmental setting along with dismissImmersiveSpace.
For example, we can use the scenePhase value of the main content view to determine if it's been closed, and use that to hide the immersive view:
.onChange(of: showImmersiveSpace) { _, newValue in
Task {
if newValue {
await showImmersiveView()
} else if immersiveSpaceIsShown {
immersiveSpaceIsShown = false
await dismissImmersiveSpace()
}
}
}
.task(id: scenePhase) {
switch scenePhase {
case .inactive, .background:
immersiveSpaceIsShown = false
showImmersiveSpace = false
default:
break
}
}
This onChange block will show the ImmersiveView if the newValue is true otherwise if the ImmersiveView is currently shown, it'll dismiss it.
Then the scenePhase task applies a switch to scenePhase that will update the showImmersiveSpace value to false when the window is closed or goes into the background. This would then result in the immersive view being dismissed.
Tracking on the ImmersiveView #
We can also keep track of whether the immersive view is showing by using scenePhase but applied to the RealityView in ImmersiveView:
.task(id: scenePhase) {
switch scenePhase {
case .inactive, .background:
isShowingImmersive = false
case .active:
isShowingImmersive = true
default:
break
}
}
Here a Binding of isShowingImmersive can be toggled and the system can be aware that the ImmersiveView has been dismissed.