swiftui wkwebview加载html字符串如何自适应高度以及图片高度
要在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来禁用滚动。
在WebView的Coordinator类中,我们实现了WKNavigationDelegate协议,并在webView(_:didFinish:)方法中使用JavaScript来获取加载内容的高度。然后,我们使用parent.updateWebViewHeight(_:)方法将高度传递给父视图,并使用GeometryReader和onPreferenceChange来更新WebView的高度。
在ContentView中,我们使用GeometryReader将WebView的高度设置为webViewHeight变量,并使用onPreferenceChange监听WebView高度的更改。在Text视图中,我们显示了WebView的高度。
请注意,这只是一个简单的示例,实际中可能会有更多的调整和优化
原文地址: https://www.cveoy.top/t/topic/h6LR 著作权归作者所有。请勿转载和采集!