Я загружаю Html контент в мой WebView.
Когда я загружаю Html контент внутри WebView, он отображается правильно. После этого, когда я обновляю sh WebView с новым Html контентом, возникает проблема.
Например: мой первый Html высота контента равна 900, он отображается правильно, а затем я перезагружаю WebView с моим новым Html контент, который имеет высоту 400, WebView не сжимается и приспосабливается к контенту с новой высотой. Высота до сих пор равна 900.
Таким образом, кажется, что WebView может изменять свой размер с меньшего количества контента, который ранее загружался в большее количество контента, но не может изменять свой размер, когда контент меньше чем ранее загруженный контент.
WebView
struct WebView: UIViewRepresentable {
@State var htmlString: String
@Binding var dynamicHeight: CGFloat
func makeUIView(context: Context) -> WKWebView {
let webView: WKWebView = WKWebView()
webView.navigationDelegate = context.coordinator
webView.scrollView.bounces = false
webView.backgroundColor = .clear
return webView
}
func updateUIView(_ uiView: WKWebView, context: Context) {
uiView.loadHTMLString(htmlString, baseURL: nil)
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, WKNavigationDelegate {
var 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: { (result, error) in
if let height = result as? CGFloat {
self.parent.dynamicHeight = height
}
})
}
})
}
}
}
Любой контент, который я использовал WebView
struct WebTest: View {
@ObservedObject var viewModel = NewsVM()
@State var index: Int = 0
@State var newID: String = ""
let screen = UIScreen.main.bounds
let formatString = "<html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=0\"><script type=\"text/javascript\" src=\"https://platform.twitter.com/widgets.js\"></script><style>@media (prefers-color-scheme: dark) { body { background-color: #1c1c1e; color: white; }} img,iframe,blockquote {\n\t\t\tmax-width: \(UIScreen.main.bounds.width - 24);\n\t\t\theight: auto\n\t\t}\n\t\t</style></head><body><span style=\"font-family: '-apple-system', 'HelveticaNeue'; font-size:17\">%@</span></body></html>"
@State private var webViewHeight: CGFloat = .zero
init(id:String) {
viewModel.fetchNews(id: id)
self.newID = id
}
var body: some View {
Group{
if self.viewModel.news.count > 0 {
ModelPages(self.viewModel.news, currentPage: self.$index, wrap: false, hasControl: false) { pageIndex, new in
ScrollView(.vertical, showsIndicators: false){
Text("Height: \(self.webViewHeight)").padding()
WebView(htmlString: String(format: self.formatString, new.content), dynamicHeight: self.$webViewHeight)
.frame(width: self.screen.width - 16)
.frame(height: self.webViewHeight)
.tag(pageIndex)
.padding(.horizontal, 8)
}
}
}else{
Group{
if self.viewModel.error == true{
ConnectionError()
}else{
LoadingView()
}
}
}
}
}
}