模态显示时更改NavigationView栏的背景

时间:2019-10-13 14:32:48

标签: swiftui ios13 ios-navigationview

我不知道将导航栏设置为不透明黑色的方法...

如果以导航方式显示导航视图,则所有相关的hacks似乎都不起作用...

这是我展示我的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 个答案:

答案 0 :(得分:0)

一种可能的解决方案是避免使用NavigationView,而只需添加“完成”按钮即可获得相同的结果:

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)
        }
    }
}