画面からの遷移に依存するSwiftUIベースのアプリを使用しています。NavigationView
ナビゲーション バーの背景色を設定する必要があり、ほとんどの場合これを機能させるコードを見つけました。
アプリを縦向きモードで起動すると、すべての回転が正常に機能します。
ただし、アプリを横向きモードで起動すると、バーはデフォルトの灰色になり、最初の回転後にのみ更新されます。
以下に、問題を再現するための最小限のコードを示します。
import SwiftUI
struct ContentView: View {
var body: some View {
return NavigationView {
List {
NavigationLink(destination: Text("A")) {
Text("See A")
}
}
.background(NavigationConfigurator { navigationConfigurator in
navigationConfigurator.navigationBar.barTintColor = .orange
})
.navigationBarTitle(Text(verbatim: "Home"), displayMode: .inline)
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
struct NavigationConfigurator: UIViewControllerRepresentable {
var configure: (UINavigationController) -> Void = { _ in }
func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
UIViewController()
}
func updateUIViewController(_ uiViewController: UIViewController,
context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
if let navigationController = uiViewController.navigationController {
self.configure(navigationController)
print("Successfully obtained navigation controller")
} else {
print("Failed to obtain navigation controller")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
縦向きモードで起動したときのアプリの表示:
...横向きに回転...
最後に、ランドスケープモードで起動したときの外観です。
もログアウトしNavigationConfigurator
ましたが、ポートレート モードで起動すると、2 つの呼び出しが行われることがわかりました。1 つ目はナビゲーション コントローラーの検索に失敗しますが、2 つ目は見つかります。
ランドスケープ モードで起動すると、呼び出しが 1 回だけ行われ、それが見つかりません。回転すると、それが検出され、色が正常に更新されます。
管理を介して再描画を強制しようとしまし@State
たが、失敗しました。
アプリをポートレート モードにロックする以外に、アイデアが尽きてしまいました。