トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

VisionOS向けSwiftUI実装

前回座学した

bibinbaleo.hatenablog.com

今回はUI実装していく。実際は座学する前にChatGPTとかサンプルとか見ながらUI変えていってたので流れがぐちゃぐちゃ。

VisionOS特有の実装のドキュメントは、サンプルプロジェクトなどが置いてあったここが詳しそう

developer.apple.com

Figmaでデザイン

FigmaにAppleが出しているVisionOS用のコンポーネントがある

www.figma.com

すごい涙ぐましい努力で、ホバーされた感じとかを再現してる

これらを使って、UIを作ってみる。デフォルトのテキストのサイズは17だったのでそれに合わせたけど、目が悪くてよく見えない・・・

音声入力付き検索フィールドのUIがあったのでそれを使ってみた。

なんかださい・・・デザイン難しい

音声入力だけにするならもっとマイクボタンを大きくしてもいいけど、一応テキスト入力もできたらしたいしな~

360度画像表示した後の表示切替UIはSegmented Controlsがいいかな?実機ではデジタルクラウンで変えれるらしいが、シミュレーターじゃできないので切り替えボタンを一応つけてみる?別ウィンドウに出したほうがいいかな~

とりあえず作ったはいいけど、これをSwiftに移植できる気がしない・・・

Unityだったらな~~~uGUI完全理解してるんだけどな~~

SFシンボル

ボタンのアイコンはSF Symbolsというのを使えば、いちいち用意する必要ない。

一覧はここからアプリをダウンロードすると見れるらしい

developer.apple.com

shuhey-hashimoto.com

見れた

編集で名前をコピーできるのでこれを参照する

丸いボタン

こういうシンプルなボタンを作りたい

 

ChatGPTにお願いした文章でやったらめっちゃダサいのできてワロタ

                Button(action: {

                    // Your action here

                }) {

                    Image(systemName: "paperplane.fill")

                        .resizable()

                        .scaledToFit()

                        .frame(width: 44, height: 44)

                        .padding(10)

                        .background(Circle().fill(Color.blue))

                        .foregroundColor(.white)

                }

                .buttonStyle(PlainButtonStyle())

いい加減公式のドキュメントみたい

ここっぽいけど見ても分からない。丸いやつはデフォルトのコンポーネントじゃないのかな

developer.apple.com

サンプル見る方が早いことに気づいた。

あった!!

 

              Button {

                    appState.clearSelection(keepPrimary: false)//ボタンの処理?

                } label: {

                    Label("Dismiss", systemImage: "checkmark")

                        .labelStyle(.iconOnly)

                }

.padding(.trailing, 5)

これで表示できた!

結局色々変えて、こんなふうにした

                        Button {

                            Task { //処理

                        } label: {

                            Label("生成", systemImage: "paperplane.fill")

                        }

                        .background(Color(.blue))

                        .cornerRadius(60.0)

                        .disabled(isCreating)

ウィンドウ複数出したい

サンプルみたいに小さいウィンドウを二つ出したいけど出し方がわからない

代わりにChatGPTが教えてくれたNavigationLinkを使ったらウィンドウのリンクが出せた。struct ContentView: View みたいなのをもう一つ作ったら別ウィンドウ扱いで、そこに遷移できる

                                        NavigationLink(destination: SecondView()) {

                                            Text("360度画像表示画面へ")

                                        }.padding()

                                    }

 

30daysの25の中にあった!

 

idをつけておいて

呼び出す側でこうやっておけばいい!!

  @Environment(\.openWindow) private var openWindow

openWindow(id: "control")

できた〜!!!!!感謝感謝

公式ドキュメントによるとデフォルトの位置を変えることはできないらしい。

右に出したいのに

Positioning and sizing windows | Apple Developer Documentation

ウィンドウのサイズの変え方

デフォルトのサイズじゃなくて小さいウィンドウに変えたい

サンプルに書いていたようにこれをつけたら、小さいウィンドウはできたけど、背景に大きい下のウィンドウが残ったまま

        .frame(width: 300)

        .padding(30)

        .glassBackgroundEffect()

ググったら公式の方法出てきた

developer.apple.com

        WindowGroup {

            ContentView()

        }

        .defaultSize(CGSize(width: 700, height: 440))

これでできた!

ウィンドウのタイトルの付け方

Vstackのお尻の}の後に            

.navigationTitle("タイトル")

とつけたらウィンドウの左上にタイトルがついた

入力欄を丸角にしたい

                        TextField("英語でプロンプトを入力してください。ex:Japanese kyoto shrine", text: $prompt_text)

                            .padding()

                            .frame(width: 600)

                            .textFieldStyle(PlainTextFieldStyle())

                            .background(.regularMaterial)

                            .cornerRadius(60.0)

                            .padding([.leading, .trailing])

バックグラウンドに対して .cornerRadius(60.0)で適当な大きい値にしたらなった

くるくる

 ProgressView().progressViewStyle(CircularProgressViewStyle())

を書けばすぐ表示できた

Grid・Vstack・Hstack

わかったようなわからなかったような。

VStackは縦

HStackは横

3つ色々組み合わせてなんとかいい感じにする。

無理にGridでやろうとしない方がいい気がする

余白

Spacer()を入れると極端にスペースが入る。

Paddingで調整

中華フォント(未解決)

日本語は表示されるが、中国っぽいフォントになる;;

Youtubeの動画とかでこの文字使ってる人見るけど、これ嫌い

デバイスで日本語を選択していないとなるらしい

qiita.com

VisionOSのシミュレーターで言語の変え方がわからずデフォルトの英語のままにしているからなのか

iOS 17世代以降の新APIだと .typesettingLanguage(.init(languageCode: .japanese))とテキストに対してつけるだけで治るらしいが、VisionOSだと治らなかった

別の方法はよくやり方わからなかった。まあいいや

最後に

割とやりたいことできた