SwiftUI でよく使われる NavigationView の覚書です。
特に、タイトルバー周りについて詳細に書きます。
親子画面の移動
一般的な使い方。情報が階層化されているときに、その階層に従って、ビューを辿ることができます。
以下のようなコードで実現できます。
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink(destination: ChildView(), label: {
Text("to Child")
})
.navigationBarTitle("NavBar")
}
}
}
struct ChildView: View {
var body: some View {
Text("Child")
}
}
タイトルバーの表示/非表示
NavigationView には、タイトルを設定することができます。.navigationBarTitle modifierを使います。例:.navigationBarTitle(“NavBar”)
この modifier は、NavigationView に対して設定するのではなく、NavigationView の内部の View に設定する必要があります。
NavigationView に対して、.navigationBarTitle の modifier を設定することができてしまいますが、効果がありません。エラーにもなりませんので、気付きにくいです。
このタイトルバーを非表示にするための modifier が用意されていまして、それが、.navigationBarTitleHidden です。
まとめると、タイトルバーは、以下のときに表示されます。
・.navigationBarTitle でタイトルが設定されている
・.navigationBarTitleHidden でタイトルが非表示になるように設定されていない
タイトルが設定されていなければ表示されませんし、タイトルが設定されていても、非表示設定されていれば表示されません。
.navigationBarTitleHidden は、現在のビューだけではなく、NavigationLink 等を使って辿ったビューの表示にも影響を与えたり与えなかったりします。(バグかも)
例えば、親Viewの NavigationView で、タイトルが設定されていて、.navigationBarTitleHidden が設定されていると、子ビューでは、Backボタンが表示されません。
タイトルが設定されずに、.hidden 設定されると、子ビューでは、Backボタンが表示されます。
この振る舞いには、統一感を感じないので、将来的に変更されそうな気もしますが、Xcode11.5 の現在では上記のような振る舞いをします。
.navigationViewTitleBarHidden は、landscape モードでは、うまく動かない
手持ちのシミュレータ、iPhone6Sで確認しましたが、landscape モードでは、タイトルバーが .navigationBarHiddenTitle としても表示されてしまいます。
NavigationBar を透明色にする方法があるので、それで対応するのが良いかと思います。
Sponsor Link