SwiftUI - изменение цвета панели навигации не применяется к строке состояния

Имею следующее:

var body: some View {
        NavigationView {
            VStack {
                 Text("Hello")
            }.navigationBarTitle("Edit Profile", displayMode: .inline)
             .background(NavigationConfiguration { nc in
                 nc.navigationBar.barTintColor = .red
                 nc.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.black]
            })
        }.navigationViewStyle(StackNavigationViewStyle())
}

Для настройки панели навигации у меня есть:

struct NavigationConfiguration: UIViewControllerRepresentable {
    var configuration: (UINavigationController) -> Void = { _ in }
    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfiguration>) -> UIViewController {
        UIViewController()
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfiguration>) {
        if let nc = uiViewController.navigationController {
            self.configuration(nc)
        }
    }
}

Но по какой-то причине верхняя строка состояния отсутствует и к ней не применяется цвет:

Изображение строки состояния

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

Я пробовал следующее, но это не удалось:

init() {
    UINavigationBar.appearance().backgroundColor = .red
}

person Gurmukh Singh    schedule 31.05.2020    source источник


Ответы (2)


Попробуйте следующее (он должен работать, по крайней мере, так, как было протестировано с Xcode 11.4 / iOS 13.4, но кто-то сообщил, что это не так, поэтому это может быть зависимым)

демо

init() {
       let navBarAppearance = UINavigationBarAppearance()
       navBarAppearance.configureWithOpaqueBackground()
       navBarAppearance.backgroundColor = UIColor.systemRed

       UINavigationBar.appearance().standardAppearance = navBarAppearance
}
person Asperi    schedule 31.05.2020
comment
Это влияет только на текущую панель просмотра или на все панели навигации в приложении? - person Di Nerd; 01.06.2020
comment
@DiNerd Кажется, это применимо ко всем панелям навигации, но это решение не сработало - person Gurmukh Singh; 02.06.2020

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

struct NavigationBarModifier: ViewModifier {

var backgroundColor: UIColor = .clear

init(backgroundColor: UIColor, tintColor: UIColor = .white) {
    self.backgroundColor = backgroundColor

    let coloredAppearance = UINavigationBarAppearance()
    coloredAppearance.backgroundColor = backgroundColor
    coloredAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
    coloredAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]

    UINavigationBar.appearance().standardAppearance = coloredAppearance
    UINavigationBar.appearance().compactAppearance = coloredAppearance
    UINavigationBar.appearance().scrollEdgeAppearance = coloredAppearance
    UINavigationBar.appearance().tintColor = tintColor
}

func body(content: Content) -> some View {
    ZStack{
        content
        VStack {
            GeometryReader { geometry in
                Color(self.backgroundColor)
                    .frame(height: geometry.safeAreaInsets.top)
                    .edgesIgnoringSafeArea(.top)
                Spacer()
            }
        }
    }
}}

Я использовал его в представлении ниже:

struct DummyNavigationView: View {
var body: some View {
    NavigationView {
        VStack {
            NavigationLink(destination: Text("Page 2")) {
                Text("Go to detail")
            }
        }
        .navigationBarTitle("Edit Profile", displayMode: .inline)
    }
    .modifier(NavigationBarModifier(backgroundColor: .red, tintColor: .black))
}}
person user832    schedule 31.05.2020
comment
все еще не повезло с этим - person Gurmukh Singh; 02.06.2020
comment
@GurmukhSingh, можете ли вы подробнее рассказать о своей проблеме, вместо того, чтобы говорить, что не повезло? Измените свой вопрос с помощью обновленного кода или предоставьте ссылку на свой проект с минимальным кодом. - person user832; 02.06.2020
comment
Также, пожалуйста, сообщите нам свою версию Xcode и iOS. - person user832; 02.06.2020