当 WKWebView 框架调整大小时,内容大小损坏

Posted

技术标签:

【中文标题】当 WKWebView 框架调整大小时,内容大小损坏【英文标题】:When the WKWebView frame is resized, the content size broken 【发布时间】:2021-03-21 16:46:59 【问题描述】:

在做 didFinishNavigation 之后,我尝试调整 WKWebView 框架的大小,导致加载的内容大幅调整大小。如何避免这种情况?

例如,加载页面后,我想从 WKWebView 中获取信息,使用评估 javascript 来调整内容的大小并将 WKWebView 设置为适当的大小。

【问题讨论】:

你看过设置 WKWebView.contentMode 了吗?有一个名为 sizeThatFits(CGSize) 的属性会尝试将内容调整为提供的大小。您可以在 didFinishNavigation 之后将原始帧 CGSize 提供给该参数以强制使用内容模式。见:developer.apple.com/documentation/uikit/uiview/… 【参考方案1】:

您可以在加载时使用以下代码设置 webview 高度

 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 
        webView.evaluateJavaScript("document.documentElement.scrollHeight", completionHandler:  (height, error) in
            self.webViewHeightConstraint?.constant = height as! CGFloat
        )
    

【讨论】:

【参考方案2】:

您指的是使用 javascript 检测 webview 内容高度并手动设置高度的方法,应该适合您。

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 
    print("webview did enter did finish navigation")
    webView.evaluateJavaScript("document.readyState", completionHandler:  (complete, error) in
        if complete != nil 
            webView.evaluateJavaScript("document.body.scrollHeight", completionHandler:  (result, error) in
                if let heightOfContent = result as? CGFloat 

                
            )
        
    )

我也认为@binaryPilot 有一个很好的建议。

有一个名为sizeThatFits(CGSize) 的属性会尝试调整大小 内容到提供的大小。你可以提供那个原始框架 CGSize 在 didFinishNavigation 之后对该参数强制一个内容 模式。见:[这里][1] [1]:https://developer.apple.com/documentation/uikit/uiview/1622619-contentmode

【讨论】:

以上是关于当 WKWebView 框架调整大小时,内容大小损坏的主要内容,如果未能解决你的问题,请参考以下文章

调整 UIWebView 框架大小时如何禁用 UIWebView 调整内容大小

如何确定 WKWebView 的内容大小?

如何确定 WKWebView 的内容大小?

WKWebView 动态调整大小问题

当 Web 视图内容调整大小时确定 UIWebView 高度

调整框架(窗口)大小后组件消失