Изменение фона панели NavigationView при модальном представлении

Я не могу придумать способ сделать панель навигации непрозрачной черной...

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

Вот как я представляю свой webView:

               Button(action: { self.showFAQ.toggle() }) {
                        Text("Frequently Asked Questions").foregroundColor(.orange)
                    }.sheet(isPresented: $showFAQ) {
                        WebView(isPresented: self.$showFAQ, url: self.faqURL)
                    }

Это моя оболочка webView:

struct WebView: View {
    let url: URL

    @Binding var isPresented: Bool

    var body: some View {
        NavigationView {
            WebViewRepresentable(url: url)
                .navigationBarTitle("", displayMode: .inline)
                .navigationBarItems(trailing: Button(action: {
                    self.isPresented.toggle()
                }, label: { Text("Done") } ))
        }
    }

    init(isPresented: Binding<Bool>, url: URL) {
        self.url = url
        self._isPresented = isPresented

        let appearance = UINavigationBarAppearance()
        appearance.configureWithOpaqueBackground()
    }

    struct WebViewRepresentable: UIViewRepresentable {
        let url: URL

        // Creates a UIKit view to be presented.
        func makeUIView(context: Context) -> WKWebView {
            let webView = WKWebView()
            webView.isOpaque = false
            webView.backgroundColor = .systemBackground
            return webView
        }

        // Updates the presented UIKit view (and its coordinator)
        // to the latest configuration.
        func updateUIView(_ uiView: WKWebView, context: Context) {
            let req = URLRequest(url: url)
            uiView.load(req)
        }
    }
}

UINavigationBarAppearance() игнорируется... UINavigationBar.appearance() тоже игнорируется...

1 ответ

Решение

Возможное решение - не использовать NavigationView и просто добавить кнопку Done для достижения того же результата:

struct WebView: View {
    let url: URL

    @Binding var isPresented: Bool

    var body: some View {
        VStack {
            HStack {
                Spacer()
                Button(action: {
                    self.isPresented.toggle()
                }) {
                    Text("Done").padding(.all, 20)
                }
            }
            WebViewRepresentable(url: url)
        }.background(Color.black.opacity(1.0))
         .edgesIgnoringSafeArea(.all)
    }

    init(isPresented: Binding<Bool>, url: URL) {
        self.url = url
        self._isPresented = isPresented

        let appearance = UINavigationBarAppearance()
        appearance.configureWithOpaqueBackground()
    }

    struct WebViewRepresentable: UIViewRepresentable {
        let url: URL

        // Creates a UIKit view to be presented.
        func makeUIView(context: Context) -> WKWebView {
            let webView = WKWebView()
            webView.isOpaque = false
            webView.backgroundColor = .systemBackground
            return webView
        }

        // Updates the presented UIKit view (and its coordinator)
        // to the latest configuration.
        func updateUIView(_ uiView: WKWebView, context: Context) {
            let req = URLRequest(url: url)
            uiView.load(req)
        }
    }
}
Другие вопросы по тегам