使用 immersionStyle
可以設定 visionOS 中 Scene 能支援的模式。
專屬 visionOS 的 ImmersiveSpace
visionOS 跟其他 OS 相比,最特別的就是能讓使用者進入另一個空間,也就是所謂的「unbounded space」。為了實現這樣的效果,不能使用跨 Apple 平台的 WindowGroup,要使用專屬於 visionOS 的 ImmersiveSpace
。
@main
struct Example: App {
var body: some Scene {
ImmersiveSpace {
SolarSystem()
}
}
}
當我們只寫了 ImmersiveSpace,沒做任何設定時,預設會使用 AutomaticImmersionStyle(.automatic
),SwiftUI 便會對 ImmersiveSpace 使用 .mixed
style。
visionOS 上的三種 ImmersionStyle
除了 AutomaticImmersionStyle,visionOS 有三種主要的 ImmersionStyle:
FullImmersionStyle(.full
)
在 Full 的情況下,使用者周遭的環境會被隱藏,這個周遭的環境叫做 pass-through,同時,其他的 App 也會被隱藏,除了使用者的手。但要注意的是,雖然 FullImmersionStyle 能隱藏周圍的空間,但我們還必須提供 SwiftUI 背景,不然還是會看到周圍的環境。
MixedImmersionStyle(.mixed
)
Mixed 是預設的 Style,在這個情況下,ImmersiveSpace 可與其他的 App 內容共處在同一個環境中(Shared Space),也能看到周圍的環境 pass-through。
ProgessiveImmersionStyle(.progessive
)
Progessive 是 Mixed 與 Full 之間的過渡,SwiftUI 會在使用者面前開出一個 180° 的 Full 空間,後方則還看得到 pass-through。在這個模式下,使用者可透過 Digital Crown 調整角度,也就是在 Apple Vision Pro 上方角落的錶冠,把 180° 縮小,或是放大到進入 Full 模式。
設定 ImmersiveSpace 的 ImmersionStyle
要指定 ImmersiveSpace 的 ImmersionStyle 可以使用 immersionStyle
這個 Scene modifier:
@main
struct Example: App {
@State private var currentStyle: ImmersionStyle = .mixed
var body: some Scene {
ImmersiveSpace {
SolarSystem()
}
.immersionStyle(selection: $currentStyle, in: .mixed, .progressive, .full)
}
}
immersionStyle(selection:in:)
的第一個參數要吃 Binding,也就是目前 Scene 所使用的 ImmersionStyle,而第二個參數則是此 ImmersiveSpace 能支援的 ImmersionStyle。像目前這樣寫,就是支援所有的 ImmersionStyle 模式,透過更改 @State currentStyle 就能切換 ImmersionStyle 了。
這裡特別的是,在給第二個參數時(支援的 ImmersionStyle),如果支援多個模式,並不用包在 Array 裡,可以直接以逗號分隔傳入。
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。