要在SwiftUI中使用WKWebView加载HTML字符串并自适应高度,可以使用GeometryReader来动态计算WebView的高度。以下是一个示例代码:

import SwiftUI
import WebKit

struct ContentView: View {
    @State private var webViewHeight: CGFloat = 100
    
    var body: some View {
        VStack {
            GeometryReader { geometry in
                WebView(htmlString: "<p>This is some HTML content with an image: <br><img src=\"https://example.com/image.jpg\"></p>")
                    .frame(height: webViewHeight)
                    .onPreferenceChange(WebViewHeightPreferenceKey.self) { height in
                        webViewHeight = height
                    }
            }
            .frame(height: webViewHeight)
            
            Text("WebView Height: \(webViewHeight)")
        }
    }
}

struct WebView: UIViewRepresentable {
    let htmlString: String
    
    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.loadHTMLString(htmlString, baseURL: nil)
        uiView.scrollView.isScrollEnabled = false
        uiView.navigationDelegate = context.coordinator
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, WKNavigationDelegate {
        let parent: WebView
        
        init(_ parent: WebView) {
            self.parent = parent
        }
        
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
                if complete != nil {
                    webView.evaluateJavaScript("document.documentElement.scrollHeight", completionHandler: { (height, error) in
                        if let height = height as? CGFloat {
                            webView.frame.size.height = height
                            webView.scrollView.contentSize.height = height
                            parent.updateWebViewHeight(height)
                        }
                    })
                }
            })
        }
    }
}

struct WebViewHeightPreferenceKey: PreferenceKey {
    static var defaultValue: CGFloat = 0
    
    static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
        value = nextValue()
    }
}

extension WebView {
    func updateWebViewHeight(_ height: CGFloat) {
        DispatchQueue.main.async {
            webViewHeight = height
        }
    }
}

在上面的代码中,我们创建了一个自定义的WebView视图,它使用WKWebView加载HTML字符串。在makeUIView方法中,我们创建了一个新的WKWebView实例,并在updateUIView方法中加载HTML字符串。我们还通过设置scrollView.isScrollEnabled属性为false来禁用滚动。

WebViewCoordinator类中,我们实现了WKNavigationDelegate协议,并在webView(_:didFinish:)方法中使用JavaScript来获取加载内容的高度。然后,我们使用parent.updateWebViewHeight(_:)方法将高度传递给父视图,并使用GeometryReaderonPreferenceChange来更新WebView的高度。

ContentView中,我们使用GeometryReader将WebView的高度设置为webViewHeight变量,并使用onPreferenceChange监听WebView高度的更改。在Text视图中,我们显示了WebView的高度。

请注意,这只是一个简单的示例,实际中可能会有更多的调整和优化

swiftui wkwebview加载html字符串如何自适应高度以及图片高度

原文地址: https://www.cveoy.top/t/topic/h6LR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录