Цвет фона на панели навигации не устанавливается, когда мое приложение на основе SwiftUI запускается в ландшафтном режиме - PullRequest
1 голос
/ 24 апреля 2020

Я работаю с 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()
    }
}

Как приложение отображается при запуске в книжной ориентации режим:

enter image description here

... и повернут в горизонтальную плоскость ...

enter image description here

Наконец, как это выглядит при запуске в ландшафтном режиме.

enter image description here

Я также вышел из системы NavigationConfigurator и обнаружил, что когда запускается в портретном режиме, делается два звонка. Первый не может найти контроллер навигации, но второй не находит.

Когда я запускаю в ландшафтном режиме, выполняется только один вызов, который не может его найти. После поворота он находит его и успешно обновляет цвет.

Я пытался принудительно вызвать redr aws с помощью управления @State, но это не удалось.

Не удалось заблокировать приложение в портретном режиме у меня кончились идеи.

1 Ответ

1 голос
/ 24 апреля 2020

Если речь идет только о цвете штрихового оттенка и не требуется навигационный контроллер для более, то проще использовать внешний вид, как

struct ContentView: View {
    init() {
        UINavigationBar.appearance().barTintColor = UIColor.orange
    }
    // .. your other code here

Это решение отлично работает с любой начальной ориентацией. Протестировано с Xcode 11.4.

Альтернатива:

Если вам все еще нужен доступ через конфигуратор, следующее решение (проверено и сработало) по моему опыту более надежно

struct NavigationConfigurator: UIViewControllerRepresentable {
    var configure: (UINavigationController) -> Void = { _ in }

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
        let controller = UIViewController()
        DispatchQueue.main.async {
            if let navigationController = controller.navigationController {
                self.configure(navigationController)
                print("Successfully obtained navigation controller")
            } else {
                print("Failed to obtain navigation controller")
            }
        }
        return controller
    }

    func updateUIViewController(_ uiViewController: UIViewController,
                                context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
    }
}
...