2

画面からの遷移に依存する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たが、失敗しました。

アプリをポートレート モードにロックする以外に、アイデアが尽きてしまいました。

4

1 に答える 1