微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 SwiftUI 的 tabview 中嵌入 webview

如何解决在 SwiftUI 的 tabview 中嵌入 webview

我一直在尝试使用 PageIndexViewStyle 创建一个 TabView,其中每个页面都是一个包含图像和 WebView 的 ScrollView。当我在 TabView 之外创建页面时,@Asperi 中的示例代码 here 效果很好,但是当我在 TabView 内部移动内容时,第二个页面上的 WebView 不会显示

enter image description here

import SwiftUI
import WebKit

struct Webview : UIViewRepresentable {
    @Binding var dynamicHeight: CGFloat
    var webview: WKWebView = WKWebView()
    
    class Coordinator: NSObject,WKNavigationDelegate {
        var parent: Webview
        
        init(_ parent: Webview) {
            self.parent = parent
        }
        
        func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!) {
            webView.evaluateJavaScript("document.documentElement.scrollHeight",completionHandler: { (height,error) in
                dispatchQueue.main.async {
                    self.parent.dynamicHeight = height as! CGFloat
                }
            })
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    func makeUIView(context: Context) -> WKWebView  {
        webview.scrollView.bounces = false
        webview.navigationDelegate = context.coordinator
        let htmlStart = "<HTML><HEAD><Meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,shrink-to-fit=no\"></HEAD><BODY>"
        let htmlEnd = "</BODY></HTML>"
        let dummy_html = """
                        <p>Lorem ipsum dolor sit amet,consectetur adipiscing elit. Donec ut venenatis risus. Fusce eget orci quis odio lobortis hendrerit. Vivamus in sollicitudin arcu. Integer nisi eros,hendrerit eget mollis et,fringilla et libero. Duis tempor interdum velit. Curabitur</p>
                        <p>ullamcorper,nulla nec elementum sagittis,diam odio tempus erat,at egestas nibh dui nec purus. Suspendisse at risus nibh. Mauris lacinia rutrum sapien non faucibus. Lorem ipsum dolor sit amet,consectetur adipiscing elit. Donec interdum enim et augue suscipit,vitae mollis enim maximus.</p>
                        <p>Fusce et convallis ligula. Ut rutrum ipsum laoreet turpis soDales,nec gravida nisi molestie. Ut convallis aliquet metus,sit amet vestibulum risus dictum mattis. Sed nec leo vel mauris pharetra ornare quis non lorem. Aliquam sed justo</p>
                        """
        let htmlString = "\(htmlStart)\(dummy_html)\(htmlEnd)"
        webview.loadHTMLString(htmlString,baseURL:  nil)
        return webview
    }
    
    func updateUIView(_ uiView: WKWebView,context: Context) {
    }
}


struct ContentView: View {
    @State private var webViewHeight: CGFloat = .zero
    var body: some View {
        TabView {
            ScrollView {
                vstack {
                    Image(systemName: "doc")
                        .resizable()
                        .scaledToFit()
                        .frame(height: 100)
                    Divider()
                    Webview(dynamicHeight: $webViewHeight)
                        .padding(.horizontal)
                        .frame(height: webViewHeight)
                }
            }
            
            ScrollView {
                vstack {
                    Image(systemName: "star")
                        .resizable()
                        .scaledToFit()
                        .frame(height: 100)
                    Divider()
                    Webview(dynamicHeight: $webViewHeight)
                        .padding(.horizontal)
                        .frame(height: webViewHeight)
                }
            }
        }
        .tabViewStyle(PageTabViewStyle())
        .indexViewStyle(PageIndexViewStyle(backgrounddisplayMode: .always))
    }
}

解决方法

我不能确切地告诉您是什么导致了这种奇怪的行为,但设置 Exceptionselection 参数解决了这个问题。 根据我的理解,TabView 希望我们在 SwiftUI 上提供一个选择 binding

所以,改变

TabView

 TabView {

解决了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。