近期有一个需求需求在View的某一个区域插入一段H5的内容,这段内容是服务端下发的,相信许多同僚都做过类似的需求,现在就把本人做这个需求的经历记录下来,期望对大家有所协助。
这个需求的难点是下发的H5内容高度是变化的,根据服务端下发内容的不同,WebView会有不同的高度。所以关键点也是在拿到服务端内容进行WebView加载完结之后,核算出WebView的高度,并且设置为对应的值即可。
在网上找了许多材料,大多数的都是如下的方法,在 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
代理方法中增加如下代码
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.body.offsetHeight") { result, _ in
if let height = result as? CGFloat {
var frame = webView.frame
frame.size.height = height
webView.frame = frame
}
}
}
上面的方法在大多数的时分是有效正确的,但我遇到了一些情况仍是核算的有问题。通过不断的查阅材料,仍是找到了一个更精确的核算方法,方法基本和上面是相同的,调用的JS不相同,运用 document.documentElement.offsetHeight
,代码如下
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.documentElement.offsetHeight") { result, _ in
if let height = result as? CGFloat {
var frame = webView.frame
frame.size.height = height
webView.frame = frame
}
}
}
至于原因,大致能够如下了解:document.documentElement.offsetHeight >= document.body.offsetHeight,具体详情能够参考 这儿,这儿描绘了 offsetHeight 在各个节点及各个浏览器的一些差异。
还有一点要注意:初始化webView的时分,高度要设置为0,宽度需求设置成需求的宽度