近期有一个需求需求在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,宽度需求设置成需求的宽度