🕶️

visionOSでのTabViewStyleとPickerStyleの種類と見た目

2023/07/20に公開

SwiftUIでvisionOS向けアプリの開発ができますが、ドキュメントにはTabViewStyleとPickerStyleの種類に対応するビジュアルが載っていないので、実際に試してみました。

筆者紹介: MESONでインターンをさせていただいております、さくたまです!ARとドラムとNeRFが好きです、よろしくお願いします!
https://twitter.com/sakutama_11

TabViewのデザイン

TabViewは、visionOSでは、縦向きのOrnamentがデフォルトで推奨されています。
https://developer.apple.com/design/human-interface-guidelines/tab-bars
Ornamentとは、visionOS特有のUI要素で、Windowの周りに浮かび上がるようなUI要素です。
https://developer.apple.com/design/human-interface-guidelines/ornaments
エミュレーターを使っているのでマウスで実行していますが実機では視線になります。
視線を合わせると、タブメニューの詳細が表示され、手元でタップすると内容が切り替わります。
image

TabViewの実装

https://developer.apple.com/documentation/swiftui/tabview

TabView {
    ReceivedView()
        .badge(2)
        .tabItem {
            Label("Received", systemImage: "tray.and.arrow.down.fill")
        }
    SentView()
        .tabItem {
            Label("Sent", systemImage: "tray.and.arrow.up.fill")
        }
    AccountView()
        .badge("!")
        .tabItem {
            Label("Account", systemImage: "person.crop.circle.fill")
        }
}
// ここを変更すると、タブの見た目が変わる
.tabViewStyle(DefaultTabViewStyle())

TabViewStyle

https://developer.apple.com/documentation/swiftui/tabviewstyle

DefaultTabViewStyle

image

PageTabViewStyle

image

PageTabViewStyle(indexDisplayMode: .never)で、下部のインデックス(小さいアイコン)を消せる
image

Picker + TabView

Pickerと組み合わせて、選択中のタブを@Stateで管理することができます。tabViewStyleはPageTabViewStyle(indexDisplayMode: .never)にしてインデックスが出ないようにしています。
PickerStyleにも種類があるので、その見た目も紹介します。
https://developer.apple.com/documentation/swiftui/picker
https://developer.apple.com/documentation/swiftui/tabviewstyle

struct ContentView: View {
    @State private var selection = "Received"

    var body: some View {
        Picker("", selection: $selection) {
            Text("Received").tag("Received")
            Text("Sent").tag("Sent")
            Text("Account").tag("Account")
        }
        .pickerStyle(.navigationLink)
        .padding(35)
                    

        TabView(selection: $selection) {
            ReceivedView()
                .badge(2)
                .tabItem {
                    Label("Received", systemImage: "tray.and.arrow.down.fill")
                }
                .tag("Received")
            SentView()
                .tabItem {
                    Label("Sent", systemImage: "tray.and.arrow.up.fill")
                }
                .tag("Sent")
            AccountView()
                .badge("!")
                .tabItem {
                    Label("Account", systemImage: "person.crop.circle.fill")
                }
                .tag("Account")
        }.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
    }
}

DefaultPickerStyle, MenuPickerStyle

image

InlinePickerStyle, WheelPickerStyle

image

image

PalettePickerStyle, SegmentedPickerStyle

image

visionOSで使えないスタイル

RadioGroupPickerStyle, SegmentedPickerStyle

PickerをOrnament化する + TabView

以下のコードで、PickerをOrnament化することができます。
https://developer.apple.com/design/human-interface-guidelines/ornaments
https://developer.apple.com/documentation/SwiftUI/View/ornament(visibility:attachmentAnchor:contentAlignment:ornament:)

 TabView(selection: $selection) {
    // 省略
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
.ornament(attachmentAnchor: .scene(alignment: .top)) {
    Picker("", selection: $selection) {
        Text("Received").tag("Received")
        Text("Sent").tag("Sent")
        Text("Account").tag("Account")
    }
    .pickerStyle(.automatic)
}

どこかで調整できるのかもしれませんが、背景色がないので少し見づらいです。

DefaultPickerStyle, MenuPickerStyle

image

InlinePickerStyle, WheelPickerStyle

image

PalettePickerStyle, SegmentedPickerStyle

image

スタイルが崩れてしまうもの: NavigationLinkPickerStyle

NavigationLinkPickerStyle
image

終わりに

TabViewStyleとPickerStyleの種類に対応するビジュアルをまとめてみました。SwiftUIでWindowベースのVision Proのアプリを作る際に、参考になれば幸いです。
RealityKitを用いたVolumeやFull immersiveなアプリも作っていきたいと思います!

エンジニア絶賛募集中!

MESONではXRエンジニア(Unity/Vision Pro)を絶賛募集中です! XRのプロジェクトに関わってみたい! 開発したい! という方はぜひご応募ください!

MESONのメンバーページからご応募いただくか、TwitterのDMなどでご連絡ください。

書いた人

さくたま

進士 さくら(あだな:さくたま)

慶應義塾大学大学院理工学研究科M1。CGと可視化の藤代研究室で三次元再構成に関する研究に取り組む。
最近はドラムの発表会にAR演出をつけてみたりしました。
ドラム×AR、WebAR、Luma AIとScaniverse撮影が趣味。Iwaken Lab.メンバー。

Twitter / 研究室HP

MESON Works

MESONの制作実績一覧もあります。ご興味ある方はぜひ見てみてください。

MESON Works

Discussion