我试图获取在WKWebView中呈现的文本的高度,以便稍后我可以调整视图大小以适应它。我正在使用下面的代码,它通过result
返回一个值。但是,如果我缩短(或延长)htmlString
,则此值不会发生变化。有什么建议吗?
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
var webView: WKWebView!
var htmlString: String = "<!DOCTYPE html><html><body><p>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante.</p></body></html>"
override func viewDidLoad() {
super.viewDidLoad()
//Instantiate with initial frame
webView = WKWebView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 100), configuration: WKWebViewConfiguration())
self.view.addSubview(webView)
webView.loadHTMLString(htmlString, baseURL: nil)
webView.evaluateJavaScript(("document.body.scrollHeight"), completionHandler: { result, error in
print(result)
})
}
}
答案 0 :(得分:1)
以下方法应该做一个技巧
//to get height
webView.evaluateJavaScript("document.height") { (result, error) in
if error == nil {
print(result)
}
}
//to get width
webView.evaluateJavaScript("document.width") { (result, error) in
if error == nil {
print(result)
}
}
// to get contentheight of wkwebview
func webView(webView: WKWebView!, didFinishNavigation navigation: WKNavigation!) {
println(webView.scrollView.contentSize.height)
}
答案 1 :(得分:1)
您的代码存在问题,即您在加载HTML字符串后立即评估document.body.scrollHeight
。要获得正确的高度,您必须等到HTML加载之后才花费一些时间,特别是如果这是您第一次加载HTML字符串。
这就是为什么您必须在此委托方法中评估document.body.scrollHeight
的原因:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.documentElement.scrollHeight") { (height, error) in
print(height as! CGFloat)
}
}
我已经写过关于此问题的文章,以及在blog post中在CSS中使用自定义字体的情况下如何找到正确的高度。
答案 2 :(得分:0)
为了获得webView的确切高度,您应该确保webView不在加载状态。 这是我使用的代码。
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
if webView.isLoading == false {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
if complete != nil {
webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
if error == nil {
guard let height = height as? CGFloat else { return }
webView.frame.size.height = height
self.webViewContainerHeightConstraint.constant = height
webView.sizeToFit()
self.view.updateConstraints()
self.view.updateConstraintsIfNeeded()
}
})
}
})
}
}}
我在iPhone 5s上也遇到了问题,宽度不正确。所以我添加了这段代码,以确保正确的框架。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
myWebView.frame = webViewContainer.bounds }