SwiftUI

2023 年 11 月 5 日

SwiftUI 切換 visionOS Scene 的 ImmersionStyle

已複製到剪貼板


使用 immersionStyle 可以設定 visionOS 中 Scene 能支援的模式。

visionOS 中,不同程度的 ImmersionStyle
visionOS 中,不同程度的 ImmersionStyle

專屬 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 裡,可以直接以逗號分隔傳入。

分享文章

已複製到剪貼板

主題文章

查看 SwiftUI

超級感謝

關於 XcodeProject

XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。


Contacts

Ricky Chuang

XcodeProject

RickyChuang.xcodeproj@gmail.com

XcodeProject 聯絡

contact.xcodeproj@gmail.com

最新文章