はじめに
私はSwiftUIについてはまだまだ勉強中なのでなにが定石だというのがわかっていませんが、アプリを作るに当たってとあることに躓きました。
SwiftUIによるUI構築で、NavigationViewとTabViewを使うときは、基本的にTabView内でNavigationViewを呼び出す形になると思うので、TabViewによる遷移した先の画面には全てTabが表示されてしまうわけです。
それは当たり前なんですけど、私はてっきりNavigationViewのオプションで「TabViewを非表示」みたいなのが用意されていると思っていたのですが、どうやらないらしい。
そこで私が調べた解決策として3つほどメモとして残しておきたいと思います。
そもそもなんでないの?
タブバーを非表示にしたい、なんて需要は確実にあると思うし、実際に検索してもその対処法などがいろいろ見つかりました。
ネット情報を漁っていると「まだSwiftUIは提供されているパーツが不完全なのでこれから用意される」とかいろいろと書いてあったりはしたのですが、Appleのガイドラインには以下の表記がありました。
Don’t hide a tab bar when people navigate to different areas in your app. A tab bar enables global navigation for your app, so it should remain visible everywhere. The exception to this is in modal views. Because a modal view gives people a separate experience that they dismiss when they’re finished, it’s not part of the overall navigation of your app.
https://developer.apple.com/design/human-interface-guidelines/ios/bars/tab-bars/
つまり、基本的にはタブバーは常時表示するものだから、そういう風に使ってねみたいなニュアンスと受け取りました。
その例外として、Modal View(sheet)を使うことができるとなってます。
ガイドラインでそう書いてあるんだからシートでいいや。で済む場合はこれで解決です。
しかし、シートのようにフルスクリーンじゃないビューは困る。
という場合には以下の方法が使えます。
trailing:
Button(action: {flag = true}) {
Image(systemName: "gearsgape.fill")
}.fullScreenCover(isPresented: $flag) {
AnotherView()
}
フラグを作っておいて、ボタンを押した際にフルスクリーンのビューを表示するというサンプルです。
個人的にはこの手法なら抵抗なく使えるかなといった感じ。
紹介はしませんが独自のTabViewっぽいものを作ってうんちゃらっていうのも結構ありましたが、こっちのほうが手軽だと思います。
何度も言いますが定石がわからないので不十分な情報であれば申し訳ございません。